1024 Palindromic Number(25分)

题目翻译:

给出一个数和允许翻转的次数,每次将它翻转后与原数相加,判断相加后的数是不是一个回文数,如果是则输出这个回文数和翻转进行的此时。如果达到最大限定次数还不是回文数,就输出这个数和允许翻转次数。

题解思路:

如果采用long long型变量,n可能有10的10次方,k可能达到100,这么大的数据long long也是装不下的,所以必须用字符串,因此可以用我们平时加减乘除的模拟而已)。只要判断好什么时候进位就可以。

代码:

#include
using namespace std;

string string_add(string a, string b)
{
	int max_length = max(a.size(), b.size());
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	int carry = 0;
	string add_result;
	for (int i = 0;i < max_length;i++)
	{
		int temp_a = (i < a.size()) ? a[i] - '0' : 0;
		int temp_b = (i < b.size()) ? b[i] - '0' : 0;
		int temp_result = (temp_a + temp_b + carry) % 10;
		carry = (temp_a + temp_b + carry) / 10;
		add_result.insert(add_result.begin(), temp_result + '0');
	}
	if (carry == 1)add_result.insert(add_result.begin(), '1');
	return add_result;
}

int is_Palindromic(string p)
{
	string q = p;
	reverse(p.begin(), p.end());
	return (p == q) ? 1 : 0;
}

int main()
{
	string N;
	int K;
	cin >> N >> K;
	if (is_Palindromic(N))
	{
		cout << N << endl << 0;
		return 0;
	}
	for (int i = 1;i <= K;i++)
	{
		string temp_N = N;
		reverse(temp_N.begin(), temp_N.end());
		N = string_add(N, temp_N);
		if (is_Palindromic(N))
		{
			cout << N << endl << i;
			return 0;
		}
	}
	cout << N << endl << K;
}

坑点:

你可能感兴趣的:(算法)