解题思路:
对于输入,利用字符数组A进行存储N进制的数,如果该N进制数本身就是一个回文数,那么步骤为0,循环结束;
循环结束的出口为得到一个回文数的结果,或者步骤已经超过30步
函数: f:将A翻转存储在B中
huiwen:判断一个数组是否是回文数
add:将两个字符数组相加,结果存储在A中
reset:将数组A把变成符合N进制的形式
注意事项:
参考代码:
#include<stdio.h> #include<string.h> void f(char A[],char B[]){ int i,j; for(i=strlen(A)-1,j=0;i>=0;i--,j++) B[j]=A[i]; } int huiwen(char A[]){ int i,j; for(i=strlen(A)-1,j=0;i>=j;i--,j++) { if(A[i]!=A[j]) return 0; } return 1; } void add(char A[],char B[]){ int i; for(i=0;i<strlen(A);i++) A[i]=(A[i]-'0'+B[i]-'0')+'0'; } void reset(char A[],int N){ int i; for(i=strlen(A)-1;i>=1;i--) { if((A[i]-'0')>=N) { A[i-1]=(A[i-1]-'0')+(A[i]-'0')/N+'0'; A[i]='0'+(A[i]-'0')%N; } } if((A[0]-'0')>=N) { int temp=(A[0]-'0')/N; for(i=strlen(A)-1;i>=1;i--) A[i+1]=A[i]; A[1]='0'+(A[0]-'0')%N; A[0]='0'+temp; } } int main(){ char A[100],B[100]; int N; scanf("%d",&N); getchar(); scanf("%s",A); int flag=1; int count=0; while(1){ if(huiwen(A)||count>30){ break; } else{ count++; f(A,B); add(A,B); reset(A,N); } } if(count>30) printf("Impossible!\n"); else printf("STEP=%d\n",count); }
0.0分
0 人评分