PAT-ADVANCED1023——Have Fun with Numbers
阿新 • • 發佈:2018-12-20
題目描述:
題目翻譯:
1023 和數字玩得開心
請注意,數字123456789是一個9位數字,由1到9的數字組成,沒有重複。 雙倍它我們將獲得246913578,這恰好是另一個9位數字,由1到9的數字組成,只是排列不同。 嘗試著看看再次加倍的結果!
現在你要檢查是否有更多數字滿足此性質。 也就是說,給定一個k位數,你要判斷結果數字加倍後的結果是否只包含原始數字中數字的排列。
輸入格式:
每個輸入檔案包含一個測試用以。每個測試用例給出一個不超過20位的正整數。
輸出格式:
對每個測試用例,如果加倍輸入後的數字只是原數字的每一位數的不同的排列,輸出“Yes”,否則輸出“No”。然後在下一行輸出翻倍後的數字。
輸入樣例:
1234567899
輸出樣例:
Yes
2469135798
知識點:大數加法
思路:字串加法
時間複雜度是O(n),其中n為輸入正整數的位數。
C++程式碼:
#include<iostream> #include<string> using namespace std; string reverse(string s); string add(string s1, string s2); bool judge(string s1, string s2); int main() { string input; cin >> input; string sum = add(input, input); if(judge(input, sum)) { cout << "Yes" << endl; } else { cout << "No" << endl; } cout << sum << endl; return 0; } 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 judge(string s1, string s2) { int count1[10]; //count1[i]表示s1字串中字元i出現的次數 fill(count1, count1 + 10, 0); for(int i = 0; i < s1.length(); i++) { count1[s1[i] - '0']++; } int count2[10]; //count2[i]表示s2字串中字元i出現的次數 fill(count2, count2 + 10, 0); for(int i = 0; i < s2.length(); i++) { count2[s2[i] - '0']++; } for(int i = 0; i < 10; i++) { if(count1[i] != count2[i]) { return false; } } return true; }
C++解題報告: