【简便解法】1079 延迟的回文数 (20分)_31行代码AC
立志用更少的代碼做更高效的表達
PAT乙級最優解+分析匯總——>傳送門
給定一個 k+1 位的正整數 N,寫成 ak…a1a0的形式,其中對所有 i 有 0≤a?i<10 且 a?k
?? >0。N 被稱為一個回文數,當且僅當對所有 i 有 a?i=a?k?i。零也被定義為一個回文數。
非回文數也可以通過一系列操作變出回文數。首先將該數字逆轉,再將逆轉數與該數相加,如果和還不是一個回文數,就重復這個逆轉再相加的操作,直到一個回文數出現。如果一個非回文數可以變出回文數,就稱這個數為延遲的回文數。(定義翻譯自 https://en.wikipedia.org/wiki/Palindromic_number )
給定任意一個正整數,本題要求你找到其變出的那個回文數。
輸入格式:
輸入在一行中給出一個不超過1000位的正整數。
輸出格式:
對給定的整數,一行一行輸出其變出回文數的過程。每行格式如下
A + B = C
其中 A 是原始的數字,B 是 A 的逆轉數,C 是它們的和。A 從輸入的整數開始。重復操作直到 C 在 10 步以內變成回文數,這時在一行中輸出 C is a palindromic number.;或者如果 10 步都沒能得到回文數,最后就在一行中輸出 Not found in 10 iterations.。
輸入樣例 1:
97152
輸出樣例 1:
97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.
輸入樣例 2:
196
輸出樣例 2:
196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7436
7436 + 6347 = 13783
13783 + 38731 = 52514
52514 + 41525 = 94039
94039 + 93049 = 187088
187088 + 880781 = 1067869
1067869 + 9687601 = 10755470
10755470 + 07455701 = 18211171
Not found in 10 iterations.
分析
經典的字符串處理題。
做這種題的訣竅是:
靈活運用#include<string>中字符串函數。
何時翻轉(reverse())?
何時查找(find(), count())?
何時while循環配合判斷使用?
在什么情況下截取(substr())?
什么情況下要向整型或浮點型轉換(stringstream、sscanf()、sprintf())?
等等等等。 函數運用的越純熟, 我們做題的效率和成功率就越高。
#include<bits/stdc++.h> using namespace std; int main() {string s2; cin >> s2;string s1 = s2; reverse(s2.begin(), s2.end());int num = 0;while(1) {if(s1 == s2) {cout << s1 << " is a palindromic number.\n";break;} else {string s3;int jin = 0;for(int i = 0; i < s1.length(); i++) {s3 += (s1[i]-'0'+s2[i]-'0'+jin)%10 + '0';jin = (s1[i]-'0'+s2[i]-'0'+jin)/10;}if(jin != 0) s3 += jin+'0'; cout << s1 << " + " << s2 << " = ";s2 = s3; //s2賦值 reverse(s3.begin(), s3.end()); cout << s3 << '\n';s1 = s3; //s1賦值 if(++num == 10) {cout << "Not found in 10 iterations.\n"; break; }}}return 0; }
耗時
每日一句
有些鳥是不能被關在籠子里的,他們的羽翼太奪目了,當他們飛走的時候,你心里會清楚,把它們關起來是一種罪惡。??????——《肖申克的救贖》
總結
以上是生活随笔為你收集整理的【简便解法】1079 延迟的回文数 (20分)_31行代码AC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【简便解法】1078 字符串压缩与解压
- 下一篇: 【详细解析】1080 MOOC期终成绩