算法分析:
大数问题,需要利用快速幂取模算法。
所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。求a^b mod c = 几。 (result就是取余后的结果)
首先我们需要知道一点:首先要了解这样一个公式:a^b mod c=(a mod c)^b mod c(详细证明请看数论或者离散数学)
了解了这个公式,我们可以先让a关于c取余,这样可以大大减少a的大小, 于是不用思考的进行了改进,代码如下:
主要思想是:
利用二进制将运算二分,大大减少了运算量,同时利用公式 a^b mod c=(a mod c)^b mod c,先将a对c取余是数据缩小从而使运算量减小
例如3^18 18的二进制为10010 算法模拟二进制的转换(辗转相处法) r=3^2*3^16
int Pow(int a, int b, int c) { int r = 1; a = a % c; while(b>0) { if(b % 2 = = 1) r = (r * a) % c; b = b/2; a = (a * a) % c; } return r; }
nyoj 题目地址http://acm.nyist.net/JudgeOnline/problem.php?pid=102
Code:
#include<stdio.h> #include<stdlib.h> long long pow(long long a,long long b,long long c); int main(void) { long long a,b,c; int n; scanf("%d",&n); while(n--){ scanf("%lld%lld%lld",&a,&b,&c); printf("%lld\n",pow(a,b,c)); } return 0; } long long pow(long long a,long long b,long long c) { int r=1; a=a%c; while(b>0){ if(b%2==1) r=(r*a)%c; b=b/2; a=(a*a)%c; } return r; }
参考博客:http://www.2cto.com/kf/201408/322144.html
这个博客讲的十分详细