首先需要知道一个公式 a*b%c=((a%c)*b)%c,然后就可以根据这个公式试着写一个效率并不高的算法。
/*
(a*a*a*...*a)%c
=((a*a*..*a)%c*a)%c
=(((a*..*a)%c*a)%c*a)%c
=(((((a%c*a)%c...*a)%c*a)%c*a)%c*a)%c
*/
#include<stdio.h>
int qmod(int a,int b,int c)
{
//根据推出的式子,易知
int sum=a%c;
b=b-1;
while(b--)
{
sum=sum*a%c;
}
//为了更为美观简洁,可写成
int sum=1;//a*1=a
while(b--)
{
sum=sum*a%c;
}
return sum;
}
int main()
{//a*b%c==((a%c)*b)%c
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
printf("%d\n",qmod(a,b,c));
}
}
这个公式 a^b %c ,上面已经优化了mod 取模方面
现在关键就是优化 a^b 了。
这两个简单公式需要记住: 1):a^b=(a^2)^(b/2) -->b为偶数 2):a^b=(a^2)^(b/2)*a -->b为奇数
#include<stdio.h>
int qmod(int a,int b,int c)
{
int sum=1;
while(b)
{
if(b&1)
sum=sum*a%c;//要多乘一个a;
a=a*a%c;
b>>=1;
}
return sum;
}
int main()
{//a*b%c==((a%c)*b)%c
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
printf("%d\n",qmod(a,b,c));
}
}
附:1): yy 右移 x 代表 yy 除以 2^x 2):yy 左移移 x 代表 yy 乘以 2^x
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/stffer/article/details/47333769