1. 程式人生 > >PAT-ADVANCED1023——Have Fun with Numbers

PAT-ADVANCED1023——Have Fun with Numbers

題目描述:

題目翻譯:

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++解題報告: