回文数
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 37 Accepted Submission(s) : 11
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEPl: 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”
上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
Input
输入有多组数据,每组数据有两个数分别为进制数M和数N。
Output
求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
Sample Input
10 87
Sample Output
4
思路分析:这个题目因为首先要把输入的字符转化成数字,然后检查是不是回文数,如果不是就把它进行处理。把它进行相加处理,然后又点细节处理就是把a【0】做为记数的个数。
代码:
#include<iostream> #include<string> #include<cstring> using namespace std; int ans,n,a[101],b[101],i; string s; void zhuanhuan() { memset(a,0,sizeof(a)); a[0]=s.length(); for(i=1;i<=a[0];i++) if(s[a[0]-i]>='0'&&s[a[0]-i]<='9') a[i]=s[a[0]-i]-'0'; else a[i]=s[a[0]-i]-'A'+10; } bool check() { for(i=1;i<=a[0];i++) if(a[i]!=a[a[0]-i+1]) return false; return true; } void jia() { for(i=1;i<=a[0];i++) b[i]=a[a[0]-i+1]; for(i=1;i<=a[0];i++) a[i]+=b[i]; for(i=1;i<=a[0];i++) {a[i+1]+=a[i]/n;a[i]%=n;}//第二次还是没有写加号所以开始又错了,因为有本来位还有数字所以要相加。 if(a[a[0]+1]>0) a[0]++; } int main() { while(cin>>n>>s) { zhuanhuan(); if(check()) {cout<<0<<endl;continue;} ans=0; while(ans++<=30) { jia(); if(check()) {cout<<ans<<endl;break;} } if(ans>30) cout<<"Impossible"<<endl; } return 0; }