原理可手动模拟运算过程
或参考君君算法课堂-基础算法 - 计网君 - 博客园 (cnblogs.com)
代码如下
#include<stdio.h>
int ci=0;
long long ksm(long long n,long long m,long long mod)
{
long long ans=1;
for(;;)
{
if(m==0)return ans;
if(m%2!=0)ans*=n;
ans%=mod;
//printf("ans=%lld\n",ans);
n*=n;
n%=mod;
m/=2;
ci++;
}
}
int main()
{
long long a,b,ans,m;
scanf("%lld%lld%lld",&a,&b,&m);
printf("%lld^%lld mod %lld=%lld\n",a,b,m,ksm(a,b,m));
printf("ci=%d\n",ci);
}
不难发现,通过快速幂的运算不仅解决了c语言函数库中自带pow函数的精度丢失导致计算错误问题,还可以大幅减少运算次数。如2的1000000000次方
将10^9的运算次数压缩到了30次。
训练题目: