傳送門:http://ybt.ssoier.cn:8088/problem_show.php?pid=1309
【題目描述】
若一個數(首位不為零)從左向右讀與從右向左讀都是一樣,我們就將其稱之為回文數。例如:給定一個 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” 。
【輸入】
給定一個N(2<N<=10或N=16)進制數M。
【輸出】
最少幾步。如果在30步以內(包含30步)不可能得到回文數,則輸出“Impossible”。
【輸入樣例】
9 87
【輸出樣例】
6
注意有16進制位因此要專門判斷,再模擬即可
#include<iostream> #include<cstring> #define N 310 using namespace std; int a[N],lena; bool hw(){ for(int i=0;i<=lena/2;i++) if(a[i]!=a[lena-i-1])return false; return true; } int main(){ int n; string m; cin>>n>>m; lena=m.size(); for(int i=0;i<lena;i++) { if(m[i]>='0'&&m[i]<='9')a[i]=m[lena-i-1]-'0'; else a[i]=(m[lena-i-1]-'A')+10; } if(hw()==true){cout<<0<<endl;return 0;} for(int i=1;i<=30;i++){ for(int j=0;j<=lena/2;j++)a[j]+=a[lena-j-1]; for(int j=lena/2;j<lena;j++)a[j]=a[lena-j-1]; for(int j=0;j<lena;j++) { if(a[j]>=n){ a[j+1]++; a[j]-=n; if(j==lena-1)lena++; } } if(hw()){ cout<<i<<endl; return 0; } } cout<<"Impossible\n"; }