7 66 8 800
9 6
AC CODE:
#include<stdio.h> int main() { int a,b; while(~scanf("%d%d",&a,&b)) { int i,temp,m,ans; a%=10; ans=a; for(i=1;i<b;i++) { ans*=a; ans%=10; if(ans==a) { //printf("%d#",i); temp=i; m=(b-1)%temp; for(i=0;i<m;i++) { ans*=a; ans%=10; } break; } } printf("%d\n",ans); } return 0; }
更简洁代码:
#include<stdio.h> main() { int a,b,c; while(~scanf("%d%d",&a,&b)) { b%=4;a%=10;c=a; if(b==0) b=4; while(--b) c=c*a%10; printf("%d\n",c); } }
两代码原理都一样,就是循环每次相乘得到结果的个位只与上次相乘的两个数的个位有关,而个位只有0~9这十个数,只需循环过程中对上次相乘的两个数都取余相乘再取余就能得到正确结果。拿34 100这对数据举例,其实只需计算4的100次方就行,但4的100次方也还是太大,计算机没有整型类型装的下,所以,可以4*4=16,对16取余得6再去乘4,这样连续运算100就能得到结果。
但提交后会发现出现TEL错误。原因在于0<b<=2^30,若b=2^30,必然花大量的时间重复循环,导致提交出现TEL。
其实可以通过找规律发现0~9最多连乘4次就会回到自身数值,例如,2连乘4个2为2*2*2*2*2=32,32对2取余得2,又回到数值2本身。所以,很多的循环是不必要重复的,只需b对4取余,再进行循环就能得到结果。这是第二个程序的中心思想。
hdoj 1097 A hard puzzle (找规律),布布扣,bubuko.com
原文地址:http://blog.csdn.net/mwangyongqi/article/details/38556571