PAT-ADVANCED1024——Palindromic Number
阿新 • • 發佈:2018-11-11
我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED
原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805476473028608
題目描述:
題目翻譯:
1024 迴文數
正向反向書寫時相同的數字稱為迴文數字。 例如,1234321是迴文數字。 所有單個數字都是迴文數字。
非迴文數字可以通過一系列操作與迴文數字配對。 首先,反轉非迴文數字,並將結果新增到原始數字。 如果結果不是迴文數,則重複這一過程,直到它給出迴文數。 例如,如果我們從67開始,我們可以分兩步獲得迴文數:67 + 76 = 143,143 + 341 = 484。
給定任何正整數N,您應該找到其配對的迴文數和找到它的步驟數。
輸入格式:
每個輸入檔案包含一個測試用例。每個測試用例由兩個正數N和K組成,其中N(<= 10 ^ 10)代表初始數字,K(< 100)代表最大步驟數。數字由一個空格分隔。
輸出格式:
對每個測試用例,在2行中每行輸出一個數字。第一個數字是操作後得到的迴文數字,第二個數字是得到該回文數字經過的操作步數。如果經過K步操作後還沒有得到迴文數,則輸出K步操作後得到的數和K。
輸入樣例1:
67 3
輸出樣例1:
484
2
輸入樣例2:
69 3
輸出樣例2:
1353
3
知識點:大數相加
思路:按題述程式設計即可
時間複雜度是O(Kn),其中n是輸入數字N的位數。空間複雜度是O(1)。
C++程式碼:
#include<iostream> using namespace std; string reverse(string s); string add(string s1, string s2); bool isPalindromicNumber(string s); int main(){ string N, tempN; int K; cin >> N >> K; int step = 0; while(!isPalindromicNumber(N)){ tempN = add(N, reverse(N)); N = tempN; step++; if(step >= K){ break; } } cout << N << endl; cout << step << endl; } string reverse(string s) { string result = ""; for(int i = s.length() - 1; i >= 0; i--) { result += s[i]; } return result; } string add(string s1, string s2) { int flag = 0; s1 = reverse(s1); s2 = reverse(s2); string result = ""; int index1 = 0; int index2 = 0; while(true) { if(index1 >= s1.length() && index2 >= s2.length()) { if(flag != 0) { result += flag + '0'; } break; } else { int num = s1[index1] - '0' + s2[index2] - '0' + flag; if(num >= 10) { num -= 10; flag = 1; } else { flag = 0; } result += num + '0'; index1++; index2++; } } return reverse(result); } bool isPalindromicNumber(string s){ for(int i = 0; i < s.length() / 2; i++){ if(s[i] != s[s.length() - 1 - i]){ return false; } } return true; }
C++解題報告: