PAT|1024 Palindromic Number(大数相加 字符串)

题目大意

向前或向后写入时将相同的数字称为回文数。例如,1234321是回文数。所有一位数字都是回文数。 非回文数可以通过一系列操作与回文数配对。首先,将非回文数反转,并将结果添加到原始数中。如果结果不是回文数,则重复此操作,直到给出回文数。例如,如果我们从67开始,则可以分两步获得回文数:67 + 76 = 143,以及143 + 341 = 484。 给定任何正整数N,您应该找到其配对的回文数和找到它所采取的步骤数。

所谓的坑

本以为使用long long 类型的可以解决大数问题,后来发现部分测试点无法通过,改为直接使用string类型,自定义相加即可。

代码

#include<bits/stdc++.h>
using namespace std;
int maxStep;
string num;
//数字转化为string
string IntToString(long long num) {
	string res;
	while (num) {
		res.push_back(char(num % 10 + '0'));
		num = num / 10;
	}
	reverse(res.begin(), res.end());
	return res;
}
//string转化为数字
long long StringToInt(string str) {
	long long res = 0;
	for (int i = 0; i < str.size(); i++) {
		res += (str[i] - '0') * pow(10, str.size() - i - 1);
	}
	return res;
}
//判断回文
bool judgetPalindromic(string str) {
	int size = str.size();

	for (int i = 0; i <= size / 2; i++) {
		if (str[i] != str[size - 1 - i]) {
			return false;
		}
	}
	return true;
}
//两个字符串表示的数字相加
string plusString(string s1, string s2) {
	string s;
	int size1 = s1.size() - 1;
	int size2 = s2.size() - 1;
	int fa = 0;

	while (size1 >= 0 && size2 >= 0) {
		s.push_back(char(((s1[size1] - '0') + (s2[size2] - '0') + fa) % 10 + '0'));
		fa = ((s1[size1] - '0') + (s2[size2] - '0') + fa) / 10;
		size1--;
		size2--;
	}
	if (fa) {
		s.push_back(char(fa + '0'));
	}
	return s;
}

int main() {
	cin >> num >> maxStep;
	string tem;
	for (int i = 0; i < maxStep; i++) {
		if (judgetPalindromic(num)) {
			cout << num << endl;
			cout << i;
			return 0;
		}
		tem = num;
		reverse(tem.begin(), tem.end());
		num = plusString(num, tem);
	}
	reverse(num.begin(), num.end());
	cout << num << endl;
	cout << maxStep;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值