求A^B的最后三位数表示的整数,如果A=0, B=0,则表示输入数据的结束。ACM/HDU 可AC

求A^B的最后三位数表示的整数,如果A=0, B=0,则表示输入数据的结束。ACM/HDU 可AC

##当A,B很大时,数据会溢出,此时需要找到数学技巧~我是这样想的:

  • 1、计算方法为:不断将A^B式子的指数除2,基数平方,原式仍成立

  • 2、技巧为: 最后三位数的乘积最多只与三位数的运算有关,故进行以下取数 :
    - - - - c_表示奇次幂进位的a,当c_大于1000时,对1000取余数。
    - - - - a不断平方、n不断除2
    - - - - 当n==1时,计算完毕,得到(至多)三位数的c_与(至多)三位数n的乘积
    result
    - - - - result对1000取模即为最终结果

#include<stdio.h>
#include<math.h> 
/* 
			计算方法为:不断将指数除2,基数平方
			技巧为:  最后三位数的乘积最多只与三位数的运算有关,故进行以下取数 
			c_表示奇次幂进位的a,大于1000时,对1000取余数
			a不断平方、n不断除2
			当n==1时,计算完毕,得到(至多)三位数的c_与(至多)三位数n的乘积result
			result对1000取模即为结果
*/ 
				 
int main()
{
	int a,n;
	while(scanf("%d%d",&a,&n)!=EOF&&(a!=0||n!=0))
	{
		int c_=1,result=0;
		while(n>1)
		{
			if(a>1000) a=a%1000;
			if(n%2==1)
			{
				c_ *= a;a=pow(a,2);n=(n-1)/2;
			}
			else
			{
				c_ *= 1;a=pow(a,2);n=n/2;
			}
			if(c_>1000) c_=c_%1000;
		}
		result=c_ *a%1000;
		if(n==0) result=1;
		printf("%d\n",result); 
	}
}

你可能感兴趣的:(小笔记)