正文

【回文数(二)】2008-08-12 20:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/1mi2/37540.html

分享到:

Time Limit:1000MS  Memory Limit:1000KTotal Submit:36 Accepted:10 Description 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。   又如:对于10进制数87:   STEP1:87+78 = 165         STEP2:165+561 = 726   STEP3:726+627 = 1353        STEP4:1353+3531 = 4884   在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。   写一个程序,给定一个N(2<=N<=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!” Input 共两行 第一行为进制数N(2<=N<=16) 第二行为N进制数M(0<=M<=maxlongint) Output 共一行,为“STEP=经过的步数”或“Impossible!” Sample Input 9 87 Sample Output STEP=6 Source NOIP1999    #include<stdio.h> #include<string.h> char a[10000],b[10000],c[10000]; void f(int N) //N ???????? { int temp,cout=0; int aa,bb,i; int ai=strlen(a); int bi=strlen(b); int ci1=ai>bi?ai-1:bi-1; int ci2=ci1; c[ci1+1]='\0'; cout = 0; while(ai>0&&bi>0) { if(a[ai-1]>='A') aa=a[ai-1]-55; else aa=a[ai-1]-'0'; ai--; if(b[bi-1]>='A') bb=b[bi-1]-55; else bb=b[bi-1]-'0'; bi--; temp=aa+bb+cout; cout=0; if(temp>=N) { cout=1; temp-=N; } if(temp>=10) temp+=55; else temp+='0'; c[ci1--]=temp; } if(cout==0) return ; else { c[ci2+2]='\0'; for(i=ci2;i>=0;i--) c[i+1]=c[i]; c[0]=cout+48; return ; } } int hui() { int n=strlen(a),i,j; for(i=0,j=n-1;i<=j;i++,j--) { if(a[i]!=a[j]) return 0; } return 1; } void ni() { int i=strlen(a); int j,k; for(j=0,k=i-1;j<i;j++,k--) { b[j]=a[k]; } b[j]='\0'; } int main() { int step=0,N; //while(scanf("%d",&N)!=EOF) { scanf("%d",&N); step=0; // if(N<2) break; scanf("%s",a); if(hui()) { printf("STEP=%d\n",step); return 0; } while(step<=30) { ni(); f(N); step++; strcpy(a,c); if(hui()) { printf("STEP=%d\n",step); break; } } if(step>30) printf("Impossible!\n"); } return 0; }

阅读(2127) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册