力扣题目:

50. Pow(x, n) - 力扣(LeetCode)https://leetcode.cn/problems/powx-n/

1.函数参数及返回值:

double pow (double x, double n);

返回值就是x的n次方的值;

2.函数的实现

2.1暴力

2.1.1算法思路

时间复杂度O(N); 空间复杂度O( 1 );

最朴素的方法一个一个计算,比如计算x^4,就先计算x^2,然后x^3直到x^4然后返回结果;

2.1.2代码展示

double myPow(double n, double k)
{double temp = n;if (k == 0){return 1;}else if (k > 0){//return n * myPow(n, k - 1);k--;while (k > 0){n *= temp;k--;}return n;}else if (k < 0){//return (1.0 / n) * myPow(n, k + 1);k--;n = 1.0 * n;while (k < 0){n /= temp;k++;}return n;}return -1;
}

2.2分治的思想「快速幂算法 + 递归」

2.2.1算法思路

时间复杂度O(logN); 空间复杂度O(logN);

算法的思路就是假设要计算2^64 那么就先计算2 ^ 32 然后将两个2 ^ 32相乘 以此类推:可以指数级减少运算次数;

分类讨论当n为奇数和偶数的情况:

当我们要计算x ^ n 时 可以先计算y = x ^ (n / 2), x ^ n = y ^ 2;(n 为偶数) x ^ n = y ^ 2 * x;(n 为奇数) 递归的结果为n == 0 return 1;

2.2.2代码展示

double myPowBranch(double n, long long k)
{if(k == 0){return 1;}else if(k % 2 != 0){double temp = myPowBranch(n, k / 2);return temp * temp * n;}else{double temp = myPowBranch(n, k / 2);return temp * temp;}
}
double myPow(double n, double k)
{if(n == 1 || k == 0){return 1;}else if(k < 0){return 1 / myPowBranch(n, (long long)fabs(k));}else{return myPowBranch(n, (long long)k);}
}

2.2.3易错点

鄙人再实现这个算法的时候计算当k为负值的时候,因为需要求k的绝对值使用abs函数,导致k比较大的时候出现报错的现象

在运行测试样例 2 -2,147,483,648 会报错;

报错的原因:是因为k的类型时double类型应用fabs函数来取绝对值,因为k的值找过了int类型的范围所以会产生这样的报错,abs函数只能用于整型的取绝对值。

2.3分治的思想「快速幂算法 + 迭代」

2.3.1算法思路

对2.2的方法进行了进一步的优化,由于递归要利用大量的栈空间,所以我们不采取递归的方法的,从而实现节省空间;具体思路如下(算是三个方法中最难理解的一个,但是也是最优的一个代码):

2.3.2代码展示

double myPowBranch(double x, long long N)
{double ans = 1.0;// 贡献的初始值为 xdouble x_contribute = x;// 在对 N 进行二进制拆分的同时计算答案while (N > 0) {if (N % 2 == 1){// 如果 N 二进制表示的最低位为 1,那么需要计入贡献ans *= x_contribute;}// 将贡献不断地平方x_contribute *= x_contribute;// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可N = N >> 1;}return ans;
}
double myPow(double x, double N)
{return N >= 0 ? myPowBranch(x, N) : 1.0 / myPowBranch(x, -N);
}

如果内容帮到你,请点个赞,收藏一下吧;

如果有错误,欢迎在评论区指正;

[C语言]Pow函数的实现相关推荐

  1. c语言pow函数精度差,pow()函数结果强制转化为int造成误差的分析

    开发环境:codeblocks,编译器gcc 在计算102时调用pow(10, 2),再强制类型转换为int类型后输出: printf("%d",(int)pow(,)); 得到的 ...

  2. C语言pow()函数:求x的y次方(次幂)

    1.头文件:#include 2.原型:     double pow(double x, double y);     pow() 函数用来求 x 的 y 次幂(次方)     pow()用来计算以 ...

  3. c语言pow函数的作用,c语言中pow函数的用法是什么?_后端开发

    在c言语中pow()函数是用来求x的y次幂.x.y及函数值都是double型 ,其语法为"double pow(double x, double y)":个中参数"dou ...

  4. C语言——pow函数的使用,计算一个数的n次方

    文章目录 头文件引用 原型 如何实现用pow函数开n次方 头文件引用 include<math.h> 原型 double pow( double x, double y ): 如何实现用p ...

  5. c语言pow函数用法_C语言基础的不能再基础的程序知识!“hello world”!

    涉及到的知识点有:include有两种用法.{}大括号用法解释.C语言自定义名字的要求. c语言库函数printf的解释.编译错误有两种.调用system函数.c语言编译过程. 操作系统结构.指令集中 ...

  6. C语言编程练习:用pow()函数实现求x的y次方的值

    C语言 pow() 函数用来求 x 的 y 次方的值. 头文件:math.h 语法/原型: double pow(double x,double y); 参数说明: x:双精度数. y:双精度数. 返 ...

  7. sqrt函数原型c语言,C语言sqrt函数的实例用法讲解

    前言继承是OOP设计中的重要概念.在C++语言中,派生类继承基类有三种继承方式:私有继承(private).保护继承(protected)和公有继承(public).一.继承规则继承是C++中的重要特 ...

  8. OJ1061: 顺序输出各位数字(C语言)(谈程序优化问题及pow函数耗时问题)

    题目描述 输入一个整数,从高位开始逐位分割并输出各位数字. 输入 输入一个正整数n,n是int型数据 输出 依次输出各位上的数字,每一个数字后面有一个空格,输出占一行.例如,输入 12345 ,输出 ...

  9. 【C语言】pow函数和sqrt函数

    1. pow函数 头文件 math.h 原型 double pow(double x, double y); 说明 计算x的y次方 返回值 返回幂指数的结果 #include <stdio.h& ...

最新文章

  1. java 中gui的作用_java学习中最应该注意的Java GUI用户界面以何为基础
  2. Web开发-数据格式选择
  3. android 清空所有控件,如何清空android ListView控件的内容
  4. 【theano-windows】学习笔记十——多层感知机手写数字分类
  5. MySQL日志:binlog、事务日志(redo、undo)
  6. python2和3安装后怎样切换 mac_Mac下安装配置Python2和Python3并相互切换使用
  7. dubbo中使用kryo进行对象序列化,反序列化时报错
  8. Winform-信息管理系统源码分享(Access数据库)
  9. 高通9008驱动_安卓手机高通9008模式下如何救砖
  10. 计算机硬盘存贮量单位,硬盘存储计量单位KB、MB、GB大小换算
  11. python 网盘多帐号_教你怎么拥有(很多)百度网盘2T账号
  12. debian9 使用cups远程管理打印服务
  13. SSD模型物体检测(水下生物识别)
  14. ipadpro尺寸的html,iPad Pro尺寸到底有多大?
  15. 深入理解:面向服务与微服务架构
  16. Windows XP SP3安装教程(图)
  17. js日期转换成时间戳
  18. win10黑屏Duilib资源加载失败
  19. veket linux应用软件,veket linux下载
  20. Varint+ZigZag编码和解码

热门文章

  1. 浏览器输入网址发生了什么?
  2. 使用密钥登录到ssh服务器
  3. 初见Manjaro:Manjaro 安装配置流程
  4. 七层/四层网络模型对应协议
  5. 不看OCJP考题你永远不知道自己的JAVA基础有多差(一)
  6. 联想服务器bios设置u盘启动不了系统,U盘重装系统的时候按F12不能启动,会出现联想拯救者是什么原因?bios设置U盘启动了...
  7. Type 和 class 的区别
  8. jQuery五星好评
  9. ES module和commonJS循环引用问题
  10. 人生,又怎会一如初见?