http://ecustoj.sinaapp.com/problemshow.php?pro_id=432
#include#include int b[1000];int main(){ int a,mid,square,i=0,j,flag; while(scanf("%d",&a)!=EOF) { flag=0; memset(b,9999,sizeof(b)); i=0; while(i<10000) { b[i]=a; mid=a/10%100; if(a==mid) break; square=mid*mid; for(j=0;j<=1000;j++) { if(square==b[j]) flag=1; } if(flag==1) break; a=square; i++; } if(mid==0) i++; printf("%d\n",i+1); }}
出现的特殊数据就是循环,题目给出了一个一次的特殊循环(循环节=1),如果单单考虑这一种的话,会发现结果是WA。
因而应该还存在经过几次square & 取middle之后又回到几次之前的num的情况,即循环节>1。
时间问题,采用比较蠢的办法,开一个数组,记录下之前出现过的num,一旦square之后,立刻与之前出现过的每一个num相比较,如果不存在相同的数字,那么就继续进行square & 取middle,如果存在相同的数字,那么就跳出循环。
最后应当针对不同的case对i进行处理,再把i输出。