生成迴文數
阿新 • • 發佈:2018-11-04
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<bits/stdc++.h> using namespace std; char s[1001]; int a[10100],b[10100],step=0,n,m,len=0; bool pd() { int y=1; for(int i=0;i<=(len+1)/2;i++) if(a[i]!=a[len-i-1]) y=0; return y; } void add() { int k=len; for(int i=0;i<len;i++) b[i]=a[len-i-1]; for(int i=0;i<len;i++) a[i]+=b[i]; for(int i=0;i<len;i++) { if(a[i]>=n) { a[i]-=n; a[i+1]++; if(a[len]!=0)len++; } } } int main() { cin>>n; cin>>s; int j=0; for(int i=strlen(s)-1;i>=0;i--) { if(s[i]>='0'&&s[i]<='9')//是數字 { a[j++]=s[i]-'0'; len++; } } for(int i=len-1;i>=0;i--) { b[len-i-1]=a[i]; } while(!pd() && step<=30) { add(); step++; } if(step<=30)printf("%d",step); else printf("Impossible!"); return 0; }