Pow(x, n)

原题链接Pow(x, n)

给定一个数,求n次方。n次方可以分解成两个n/2次方相乘,所以递归即可。

class Solution {
public:double myPow(double x, int n) {bool negative = n < 0;double res = helper(x, n);return negative ? 1 / res : res;}
private:double helper(int x, int n){if(n == 0)return 1;if(n == 1)return x;if(n % 2){double res = helper(x, n / 2);return res * res * x;}else{double res = helper(x, n / 2);return res * res;}}
};

Super Pow

原题链接Super Pow

同样是求某个数的n次方,但是n存在数组中,如[1, 0]代表n为10。而且数组代表的n会非常大,有可能会超过int的范围,所以直接还原n然后计算n次方的方法基本是没戏了。
既然这样,就只能从每位下手,有这样一个公式

(a * b) % k = (a % k) * (b % k) % k

以数组为[1, 2, 3, 4, 5, 6, 7]为例,表示a的1234567次方,因为有

a ^ 1234567 = (a ^ 1234560) * (a ^ 7)

所以

(a ^ 1234567) % k = (((a ^ 1234560) % k) * ((a ^ 7) % k)) % k

(a ^ 1234560) % k = ((a ^ 123456) ^ 10) % k = (((a ^ 123456) % k) ^ 10 ) % k

所以

(a ^ 1234567) % k = (((((a ^ 123456) % k) ^ 10 ) % k) * ((a ^ 7) % k)) % k

a ^ n % k抽象为f(a, n)函数,那么上式可以写成

f(a, 1234567) = f(f(a, 123456), 10) * f(a, 7) % k

可以发现,每次都可以把n的最后一位去除,从而减少n,当n为1或为0时返回即可。不过注意上面的式子对于n为[0 : 10]内的数都不需要再调用f函数了,直接求就可以,也就是将外层f改为pown

f(a, 1234567) = pown(f(a, 123456), 10) * pown(a, 7) % k
class Solution {
public:int superPow(int a, vector<int>& b) {if(b.empty())return 1;int back = b.back();b.pop_back();return pown(superPow(a, b), 10) * pown(a, back) % base_;}
private:int pown(int n, int k){/* * 因为n可能很大,这里实现取模防止在for循环result * n中溢出* 比如result为第二次for循环后的某个数,而n为INT_MAX,乘完直接溢出*/n %= base_;int result = 1;for(int i = 0; i < k; ++i)result = (result * n) % base_;return result;}const int base_ = 1337;
};

每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着相关推荐

  1. Pow(x, n) 求一个数的n次方

    我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环: ...

  2. (Java蓝桥杯算法)给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。

    [问题描述] 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: [输入格式] ...

  3. k次方 求1个数的n次方的前三位数和后三位数

    K次方 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissio ...

  4. c语言一个数的n次方,Pow(x, n) 求一个数的n次方

    我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环:d ...

  5. Java中求一个数的幂次方

    Java中求 m 的 n 次方不能使用 m^n,可使用 Math.pow(m, n) 来求m的n次方,求得结果为浮点类型.

  6. c语言for求一个数得n次方,C语言中表示一个数的次方怎样表?

    2011-06-26 C语言里"/"在表示两个数相除时,具体是怎样运算的? 是不是取不超过代有小数点的商的最大整数啊? 那个"向下取整"具体是啥意思啊? C语言 ...

  7. 利用 MPI 求素数个数

    实验题目 实验题目 利用 MPI,OpenMP 编写简单的程序,测试并行计算系统性能 实验内容 两道题,每道题需要使用 MPI 和 OpenMP 分别实现: 求素数个数 实验描述: 给定正整数 n,编 ...

  8. 每日一道 LeetCode (16):求 x 的平方根

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. LeetCode刷题: 【914】卡牌分组(求N个数的最大公因数)

    1. 题目 2. 思路 如何求N个数的最大公因数呢?(N > 1) 在初等数学里,有这么几个定理 1.任何一个整数,都可以分解为素数因子的乘积 比如 24 = 2* 2* 2 * 3: 26 = ...

最新文章

  1. 三代组装软件canu学习笔记
  2. boot spring 打印请求参数_SpringBoot打印请求参数与响应参数
  3. 列出本地git仓库中的文件?
  4. Go学习笔记07-结构体与方法
  5. Technical User Stories – What, When, and How?
  6. 深度学习-计算机视觉--图像增广
  7. oracle与raw device
  8. java并发初探ConcurrentHashMap
  9. app inventor制作手机蓝牙遥控器
  10. 如何更改linux的软件源
  11. qq2009 好像和金山词霸屏幕取词有冲突
  12. [易飞]同一单据如何根据不同用户或组限定仓库(客户)
  13. Python数据爬虫学习笔记(11)爬取千图网图片数据
  14. 读文献——《ImageNet classification with deep convolutional neural networks》
  15. 可追踪性矩阵和需求追溯性矩阵
  16. yolov7正负样本分配详解
  17. ats2851 / cm591 ugreen bluetooth 5.3 for Linux
  18. Nmap网络扫描实验
  19. c/c++语言中函数参数传递的三种方式——徐吉平
  20. linux 创建用户添加用户用户组添加修改删除(ubuntucentos)

热门文章

  1. python的基本语术_Python中的基本语句详细资料说明
  2. 【数据结构】—顺序表的插入、删除、查找操作
  3. html5爆款游戏,精华盘点:2018年的十款“爆款”独立游戏,你都玩过吗?
  4. 《dinv into python》开始了解python
  5. 洛谷P2055 [ZJOI2009]假期的宿舍 题解
  6. git clone 失败
  7. Jquery函数大全 - 案例说明
  8. CentOS 6.7编译安装PHP7
  9. ORA-12516:TNS:listener could not find available handler with matching protocol stack
  10. 学校的体育设施预订服务系统