简单的快速幂算法

来源:互联网 发布:知乎 最美av神作 编辑:程序博客网 时间:2024/05/17 09:39

简单的快速幂算法在数据比较大时能够防止数据溢出,并且减少运算时间,也是初学者比较容易掌握的一种算法

但是,我上网搜了一些后发现有的算法模板存在漏洞,先贴出来让大家看一下


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了 .....