这个数的问题是在于,int的范围在-32768~32767,所以这个算法不能判断更大的数,如果判断更大的数那么就会溢出。目前还不知道如何用C语言进行大整数的操作。有时间研究一下,马上要考数学了,很烦,必须得复习。 #include<stdio.h> #include<String.h> char input[60]; char jisuan[120]; int num1=0,num2=0; int top1=0,top2=0; //此算法的问题在于int的范围为-32858~32857 char getChar(int i) { char c; switch(i) { case 0:c='0';break; case 1:c='1';break; case 2:c='2';break; case 3:c='3';break; case 4:c='4';break; case 5:c='5';break; case 6:c='6';break; case 7:c='7';break; case 8:c='8';break; case 9:c='9';break; } return c; } int getInt(char c) { int i; switch(c) { case '0':i=0;break; case '1':i=1;break; case '2':i=2;break; case '3':i=3;break; case '4':i=4;break; case '5':i=5;break; case '6':i=6;break; case '7':i=7;break; case '8':i=8;break; case '9':i=9;break; } return i; } int judge(int length) { int tag=0; int chengshu=1; num1=0; num2=0; int i=0; //将输入的用数值形式表示出来 for(i=0;i<length;i++) { num1+=chengshu*getInt(input[length-1-i]); chengshu*=10; } //printf("%d/n",num1); //再进行判断,看是否乘以2~length时仍旧是循环的 for(i=2;i<=length;i++) { num2=i*num1; top1=-1; top2=-1; //将计算出的结果表示为字符串的形式 int j=num2; char temp[120]; while(j!=0) { int mytemp=j%10; temp[++top1]=getChar(mytemp); j=j/10; } int mm=0; for(mm=0;mm<=top1;mm++) { jisuan[mm]=temp[top1-mm]; } int *order=(int*)malloc(length*sizeof(int)); //记录与之相同的数出现的下标 for(mm=0;mm<length;mm++) { if(jisuan[mm]==input[0]) { order[++top2]=mm; } } if(top2<0) { return 1; } //比较是否有相同的可能 int mytag=1; if((top1+1)!=length) { return 1; } while(top2>=0&&mytag==1) { int kk; int jisu=0; for(kk=order[top2];kk<length;kk++) { if(jisuan[kk]==input[kk-order[top2]]) { jisu++; } } for(kk=0;kk<order[top2];kk++) { if(jisuan[kk]==input[length-order[top2]+kk]) { jisu++; } } if(jisu==length) { mytag=0; } else { if(top2==0) { return 1; } } top2--; } free(order); } return tag; } int main() { while(1) { scanf("%s",input); int length=strlen(input); if(judge(length)==0) { printf("%s is cirlic",input); } else { printf("%s is not cirlic",input); } } system("pause"); return 0; }