洛谷 P1015 回文數

2021-10-19 02:44:23 字數 1830 閱讀 7214

題目描述

若乙個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。

例如:給定乙個十進位制數56,將56加65(即把56從右向左讀),得到121是乙個回文數。

又如:對於十進位制數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(100位之內),求最少經過幾步可以得到回文數。如果在30步以內(包含30步)不可能得到回文數,則輸出impossible!

輸入格式

兩行,分別是n,m.

輸出格式

step=ans

樣例輸入輸出輸入

10

87

輸出

step=4

① 考慮到題目可能使用16進製制輸入,因此使用字元陣列s儲存輸入。

② 由於需要進行加法運算,因此將字元陣列轉換為整型陣列;c++的stl(標準模板庫)中有reverse()函式可以反轉陣列,因此使用vector型別來定義轉換後的整型陣列aint。

③ 轉換過程中,要注意對16進製制中的字母作特殊處理:

非字母轉換成數字:

if (s[i] >= '

0' && s[i] <= '

9')

字母轉換成數字: 

else

if (s[i] >= '

a' && s[i] <= '

z')

else

if (s[i] >= '

a' && s[i] <= '

z')

④ 接下來將aint反轉得到另乙個加數vectorbint。

⑤ 用vectorsumint 來儲存 aint + bint 的結果

,若 sumint 回文,則輸出相加次數;否則將 sumint 賦值給 aint,將反轉後的 sumint 賦值給 bint,再次相加得到新的 sumint。再次對 sumint 進行回文判斷……重複步驟⑤直到 sumint 回文,但如果相加次數>30則跳出迴圈,並輸出"impossible!"。

1 #include2 #include3 #include

4 #include5

6using

namespace

std;78

bool judge(vectora)914

15int

main()

1627 bint =aint;

28 sumint =aint;

29reverse( bint.begin(), bint.end() );

30for (int ans = 0; ans <= 30; ans++)

35 r = 0

;36 aint =sumint;

37 bint =sumint;

38reverse(bint.begin(), bint.end());

39for (int i = 0; i < aint.size(); i++) 44}

45 cout << "

impossible!

"<46return0;

47 }

洛谷P1015回文數

若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數56,將56加65 即把5656從右向左讀 得到121是乙個回文數。又如 對於十進位制數8787 step1 87 78 165 step2 165 561 726 step3 726 627 135...

洛谷 P1015 回文數

題目描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數5656,將5656加6565 即把5656從右向左讀 得到121121是乙個回文數。又如 對於十進位制數8787 step1 8787 7878 165165 step2 165165 5...

洛谷P1015(回文數

若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數 56,將 56 加 65 即把 5656 從右向左讀 得到 121 是乙個回文數。又如 對於十進位制數 87 step1 87 78 165 step2 165 561 726 step3 726 ...