迴文數
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; }