每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
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用数组存储着相关推荐
- Pow(x, n) 求一个数的n次方
我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环: ...
- (Java蓝桥杯算法)给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。
[问题描述] 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: [输入格式] ...
- k次方 求1个数的n次方的前三位数和后三位数
K次方 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submissio ...
- c语言一个数的n次方,Pow(x, n) 求一个数的n次方
我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目. 所需数学知识: 大致考虑正数,0,负数即可.n多个数相乘的问题. 1.简单For循环 这还不简单,马上写一个for循环:d ...
- Java中求一个数的幂次方
Java中求 m 的 n 次方不能使用 m^n,可使用 Math.pow(m, n) 来求m的n次方,求得结果为浮点类型.
- c语言for求一个数得n次方,C语言中表示一个数的次方怎样表?
2011-06-26 C语言里"/"在表示两个数相除时,具体是怎样运算的? 是不是取不超过代有小数点的商的最大整数啊? 那个"向下取整"具体是啥意思啊? C语言 ...
- 利用 MPI 求素数个数
实验题目 实验题目 利用 MPI,OpenMP 编写简单的程序,测试并行计算系统性能 实验内容 两道题,每道题需要使用 MPI 和 OpenMP 分别实现: 求素数个数 实验描述: 给定正整数 n,编 ...
- 每日一道 LeetCode (16):求 x 的平方根
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- LeetCode刷题: 【914】卡牌分组(求N个数的最大公因数)
1. 题目 2. 思路 如何求N个数的最大公因数呢?(N > 1) 在初等数学里,有这么几个定理 1.任何一个整数,都可以分解为素数因子的乘积 比如 24 = 2* 2* 2 * 3: 26 = ...
最新文章
- 三代组装软件canu学习笔记
- boot spring 打印请求参数_SpringBoot打印请求参数与响应参数
- 列出本地git仓库中的文件?
- Go学习笔记07-结构体与方法
- Technical User Stories – What, When, and How?
- 深度学习-计算机视觉--图像增广
- oracle与raw device
- java并发初探ConcurrentHashMap
- app inventor制作手机蓝牙遥控器
- 如何更改linux的软件源
- qq2009 好像和金山词霸屏幕取词有冲突
- [易飞]同一单据如何根据不同用户或组限定仓库(客户)
- Python数据爬虫学习笔记(11)爬取千图网图片数据
- 读文献——《ImageNet classification with deep convolutional neural networks》
- 可追踪性矩阵和需求追溯性矩阵
- yolov7正负样本分配详解
- ats2851 / cm591 ugreen bluetooth 5.3 for Linux
- Nmap网络扫描实验
- c/c++语言中函数参数传递的三种方式——徐吉平
- linux 创建用户添加用户用户组添加修改删除(ubuntucentos)
热门文章
- python的基本语术_Python中的基本语句详细资料说明
- 【数据结构】—顺序表的插入、删除、查找操作
- html5爆款游戏,精华盘点:2018年的十款“爆款”独立游戏,你都玩过吗?
- 《dinv into python》开始了解python
- 洛谷P2055 [ZJOI2009]假期的宿舍 题解
- git clone 失败
- Jquery函数大全 - 案例说明
- CentOS 6.7编译安装PHP7
- ORA-12516:TNS:listener could not find available handler with matching protocol stack
- 学校的体育设施预订服务系统