回文数(山东省理工OJ)
回文数(山东理工OJ)
题目描述
题目描述
与回文串的定义一样,回文数是指一个数从第一位到最后一位读和从最后一位到第一位读是一样的。例如:121、22、2 是回文数而 312 不是。给定一个数,你的任务是找到大于这个数的第一个回文数。
输入
输入包含多组测试数据,每组数据只有一个数字 N, N 不超过 10000 位且不含前导零。
输出
对于每组测试数据,输出只有一行,为大于 N 的第一个回文数
示例输入
2 312
示例输出
3 313
#include<stdio.h> #include<string.h> int main(void) { char x[10010],left[5010]; int xlen,i,j,k,h=0; while(gets(x)!=NULL) { xlen=strlen(x); //过滤前导0 for(i=0;i<xlen;i++) if(x[i]!='0') break; //不含前导0的数组x for(j=0;i<xlen;i++,j++) x[j]=x[i]; x[j]='\0'; xlen=strlen(x); //判断数组长度的奇偶性 k=0; if(xlen%2==1) k=1; //从对称轴向两边开始判断大小 for(i=xlen/2-1,j=xlen/2+k;i>=0;i--,j++) if(x[i]!=x[j]) break; //左边大的情况 if(x[i]>x[j]) { for(i=0;i<=xlen/2-1+k;i++) printf("%c",x[i]); for(i=i-1-k;i>=0;i--) printf("%c",x[i]); printf("\n"); } //右边大的情况 else { for(j=0,i=xlen/2-1+k;i>=0;i--,j++) left[j]=x[i]-'0'; left[j]='\0'; //大数加法,加1 left[0]+=1; for(i=0;i<=xlen/2-1+k;i++) { if(left[i]/10==0) break; left[i+1]+=left[i]/10; left[i]%=10; } if(i==xlen/2+k) { left[++i]='\0'; h=1; } for(i=xlen/2-1+k+h;i>=0+h;i--) printf("%d",left[i]); for(i=0+k;i<xlen/2+k+h;i++) printf("%d",left[i]); printf("\n"); h=0; } } return 0; } /************************************** Problem id : SDUT OJ 2546 User name : 李俊 Result : Accepted Take Memory : 272K Take Time : 40MS Submit Time : 2013-08-27 00:47:35 **************************************/