1. 程式人生 > >PAT-ADVANCED1024——Palindromic Number

PAT-ADVANCED1024——Palindromic Number

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