生成回文数
生成回文数
Time Limit:1000MS Memory Limit:65536K
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<=10 或者
N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
Input
N M
Output
步数
Sample Input
10 87
Sample Output
4
Hint
输入的N进制数M,其位数不超出6位
Source
NOIP1999第五届全国青少年信息学奥林匹克分区联赛普及组复赛第二题
//水题…… #include<cstdio> #include<iostream> #include<cstring> using namespace std; int step=0,ky; char s[1001]; int a[1001]={0},b[1001],len=0; bool pd(){ int y=1,i; for(i=0;i<=(len+1)/2;i++){ if(a[i]!=a[len-1-i])y=0; } return y;} void yk(){ int i,j,k=len; for(i=0;i<len;i++){ a[i]=a[i]+b[i]; } for(i=0;i<k;i++){ if(a[i]>=ky){ a[i]-=ky; a[i+1]++; if(a[k]!=0)len++; } } for(i=0;i<len;i++){ b[len-i-1]=a[i]; } } int main(){ int i,j=0; cin>>ky; cin>>s; for(i=strlen(s)-1;i>=0;i--){ if(s[i]<=57){ a[j++]=s[i]-'0'; len++; } else{ a[j++]=s[i]-'A'+10; len++; } } for(i=len-1;i>=0;i--){ b[len-i-1]=a[i]; } while(!pd() && step<=30){ yk(); step++; } if(step<=30)printf("%d",step); else printf("Impossible!"); return 0;}