演算法訓練 回文數
時間限制:1.0s 記憶體限制:256.0mb
問題描述
若乙個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。
例如:給定乙個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(其中16進製制數字為0-9與a-f),求最少經過幾步可以得到回文數。
如果在30步以內(包含30步)不可能得到回文數,則輸出「impossible!」
輸入格式
兩行,n與m
輸出格式
如果能在30步以內得到回文數,輸出「step=xx」(不含引號),其中xx是步數;否則輸出一行」impossible!」(不含引號)
樣例輸入 9
87 樣例輸出
step=6
演算法思路:
(1) 因為有16
進製的數存在,所以輸入的數
m以字串的格式輸入
(2) 將字串m
轉換成整數,存入陣列
a中,其倒序數存入陣列b中
將a與b
的和存入陣列
s中,通過函式
huiwen(int s, int l)
判斷每次所得和
s是否符合回文數
,若不符合,則通過函式
inverse(int s, int l),將s
存入a中,s
的倒序數存入
b中,再次求得a與
b的和存入
s中,直到
s是回文數。
#include#includeusing namespace std;
int a[10000],b[10000],s[10001];
bool huiwen(int s, int l)
if(i == k+1)
return 1;
else
return 0;
}void inverse(int s, int l)
}int main()
while(!huiwen(s, l) && count <= 30)
if(s[l] != 0)
l = l + 1;
inverse(s, l);
}if(count <= 30)
cout<<"step="<
演算法訓練 回文數
若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個10進製數56,將56加65 即把56從右向左讀 得到121是乙個回文數。又如 對於10進製數87 step1 87 78 165 step2 165 561 726 step3 726 627 1353 st...
演算法訓練 回文數
問題描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個10進製數56,將56加65 即把56從右向左讀 得到121是乙個回文數。又如 對於10進製數87 step1 87 78 165 step2 165 561 726 step3 726 627 13...
演算法訓練 回文數 進製加法
演算法訓練 回文數 時間限制 1.0s 記憶體限制 256.0mb 錦囊1模擬。問題描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個10進製數56,將56加65 即把56從右向左讀 得到121是乙個回文數。又如 對於10進製數87 step1 87 7...