1. 程式人生 > >1024 Palindromic Number (25 分)燚

1024 Palindromic Number (25 分)燚

1024 Palindromic Number (25 分)

A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are palindromic numbers.

Non-palindromic numbers can be paired with palindromic ones via a series of operations. First, the non-palindromic number is reversed and the result is added to the original number. If the result is not a palindromic number, this is repeated until it gives a palindromic number. For example, if we start from 67, we can obtain a palindromic number in 2 steps: 67 + 76 = 143, and 143 + 341 = 484.

Given any positive integer N, you are supposed to find its paired palindromic number and the number of steps taken to find it.

Input Specification:

Each input file contains one test case. Each case consists of two positive numbers N and K, where N (≤10​10​​) is the initial numer and K (≤100) is the maximum number of steps. The numbers are separated by a space.

Output Specification:

For each test case, output two numbers, one in each line. The first number is the paired palindromic number of N, and the second number is the number of steps taken to find the palindromic number. If the palindromic number is not found after K steps, just output the number obtained at the Kth step and K instead.

Sample Input 1:

67 3

Sample Output 1:

484
2

Sample Input 2:

69 3

Sample Output 2:

1353
3

題目大意:輸入兩個數N和K,1.N=N+N的倒序。如果N為迴環數則輸出迴環數結果,否則繼續重複1操作,重複次數小於K。

思路:1.由於涉及N的倒序,所以選擇用string更為方便,可呼叫vector<string>temp(s.rbegin(),s.rend());獲得s的倒序,比起用int型別 連續求餘相加方便的多。

            2.因為重複N=N+N的倒序操作,因此選擇用遞迴思想,結束條件為  N為迴環數,或者重複次數大於K。

坑點:輸入的N值本身就是一個迴環數,不需要變換。此時變換次數為0.

難點:涉及到int 轉char型別。在某些編譯器下可能_itoa()函式會報錯。解決辦法:用string 代替char。即int轉string,呼叫to_string(val).

#include<iostream>
#include<string>
#include<stack>
using namespace std;

//檢測自身是否為迴環數
bool checkSelf(string &number) {
	string temp(number.rbegin(), number.rend());   //求number的倒序
	bool flag = true;
	if(temp!=number)
		return false;
	return true;
}

//N=N+N的倒序
void change(string  &number, int &changeNum, int n) {
	 //檢測自身是否是個迴環數
	bool flag = checkSelf(number);  
	if (flag)
		return;
	 //檢測轉換次數是否達到上限n次
	if (changeNum == n )     
		return;
    

    //如果以上條件不成立  執行N=N+N的倒序
	int t = 0;
	string temp(number.rbegin(), number.rend());
	stack<string>result;
	//求N=N+N的倒序,並將結果逐位壓入棧中
	for (int i = number.size() - 1; i >= 0; i--) {
		string x = (to_string((int(number[i] - '0') + int(temp[i] - '0') + t) % 10 ));
		t = (int(number[i] - '0') + int(temp[i] - '0') + t) / 10;
		result.push(x);
	}
	//如果最高位相加大於10,將進位壓入棧中
	if (t == 1)  
		result.push("1");

	//更新number為相加後的和
	number.clear();
	while (!result.empty()) {
		string temp = result.top();
		number += temp;
		result.pop();
	}

	change(number, ++changeNum, n);

}

int main() {
	string number;
	int n;
	cin >> number >> n;
	int changeNum = 0;//開始的變換次數為0.
	change(number, changeNum, n);
	cout << number << endl;
	cout << changeNum << endl;
}