PAT (Advanced Level) Practice 1024 Palindromic Number (25 分)

19 篇文章 0 订阅

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 (≤ 1 0 10 10^{10} 1010 ) is the initial numer and K (≤100) is the maximum number of steps. The numbers are separated by a space.

Sample Input 1:

67 3

Sample Output 1:

484
2

Sample Input 2:

69 3

Sample Output 2:

1353
3

易错点

用int,只通过int存在的范围,但是这个题的范围是 1 0 10 10^{10} 1010 ,只用int将会实现不了

代码

注释部分用于测试

#include<iostream>
#include<algorithm>
using namespace std;
string add(string a,string b)
{
	int l = a.length();
	string d = "";
	int x = 0;
	string c;
	for(int i = l - 1;i >= 0;i--)
	{
		c = ((a[i] - '0') + (b[i] - '0') + x)% 10 + '0';
		x = ((a[i] - '0') + (b[i] - '0') + x) / 10;
		d = c + d;
//		cout << d << endl;
	}
	if(x == 0)
		return d;
	else
	{
//		cout << "c = " << c << endl;
		d = "1" + d;
//		cout << "d = " << d << endl;
	}
		
	return d;
}
int main()
{
	string n;
	int k;
	cin >> n >> k;
	int step = k;
	string fzn = n;
	for(int i = 0;i < k;i++)
	{
		reverse(fzn.begin(),fzn.end());
//		cout << "n = " << n << " fzn = " << fzn << endl;
		if(n == fzn)
		{
			step = i;
			break;
		}
		else
		{
			n = add(n,fzn);
//			cout << "n = " << n << " i = " << i << endl;
			fzn = n;
		}
	}
	cout << n << endl;
	cout << step << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43820008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值