正整数M 的N次方有可能是一个非常大的数字,我们只求该数字的最后三位
例1:
比如输入5和3 ,5的3次方为125,则输出为125
例2:
比如输入2和10 2的10次方为1024 ,则输出结果为24
例3:
比如输入111和5 111的5次方为116850581551,则输出结果为551
方法一:
因为m是比较大的数,n次方之后有可能会超出范围,我们可以利用大树相乘的方法:将数字看成一串字符串,按位相乘。但这种方法较繁琐。因为只取最后三位,我们每进行一次乘法就模1000,只留最后三位数即可。
int last_three_number(unsigned int m,unsigned int n)
{
if(0==n) return 1;
if(0==m) return 0;
unsigned int i=0,result=1;
for(;i<n;i++)
{
result*=m;
if(1000<=result)
{
result%=1000;
}
}
return result;
}
方法二:
二分求幂,在方法一的基础上,乘法不再是m*m。而是m的n/2次幂乘以m的n/2次幂。
代码如下:
int last_three_number1(unsigned int m,unsigned int n)
{
if(0==n) return 1;
if(0==m) return 0;
unsigned int i=0,result=1;
while(n!=0)
{
if(n%2==1) result=(result*m)%1000;
m=(m*m)%1000;
n/=2;
}
return result;
}