简单的快速幂算法在数据比较大时能够防止数据溢出,并且减少运算时间,也是初学者比较容易掌握的一种算法
但是,我上网搜了一些后发现有的算法模板存在漏洞,先贴出来让大家看一下
int PowerMod(int a, int b, int c) { int ans = 1; a = a % c; while(b>0) { if(b % 2 = = 1) ans = (ans * a) % c; b = b/2; a = (a * a) % c; } return ans; }
大家可以 令a=2 ,b=0 ,c=1代入进去跑一下,就会发现 return ans=1 而实际上的答案应该是0
这个算法逻辑上是没错的,应对大数的时候很好用,但是a=2 ,b=0 ,c=1 这种很简单的情况却会WA了
这里主要是 while(b>0) 和 先将ans定义为1两个条件使得 上述情况发生了错误,因此,我们只需对这种情况进行一下补充就好了
代码如下:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{ int a,b,c;
int ans=1;
while(scanf("%d %d %d",&a,&b,&c)!=EOF){
//int ans = 1;
if(b>0){
a=a%c;
int h;
h=b;
while(h>0)
{
if(h%2==1)
ans=(ans*a)%c;
h=h/2;
a=(a*a)%c;
}
// if(b==0 && c==1)
// cout<<"0"<<endl;
cout<<ans<<endl;
}
else if(b==0 && c==1)
cout<<"0"<<endl;
else if(b==0 && c!=1)
cout<<"1"<<endl;
}
return 0;
}
其实这个算法好像还有问题(但我实在没找到.......)
那个题 reduge 后AC了 .....