PAT Basic Level 1079 延迟的回文数 ( 加法模拟,reverse函数 )

题目链接:点击查看

题目描述:

给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0。N 被称为一个回文数,当且仅当对所有 i 有 a​i​​=a​k−i​​。零也被定义为一个回文数。非回文数也可以通过一系列操作变出回文数。首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现。如果一个非回文数可以变出回文数,就称这个数为延迟的回文数。给定任意一个正整数,本题要求你找到其变出的那个回文数。

输入输出格式:

输入在一行中给出一个不超过1000位的正整数。

对给定的整数,一行一行输出其变出回文数的过程。每行格式如下 A + B = C 

其中 A 是原始的数字,B 是 A 的逆转数,C 是它们的和。A 从输入的整数开始。重复操作直到 C 在 10 步以内变成回文数,这时在一行中输出 C is a palindromic number.;或者如果 10 步都没能得到回文数,最后就在一行中输出 Not found in 10 iterations.

输入输出样例:

输入

97152

输出

97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.

题目分析:

主要题目输入中要求,输入一个不超过1000位的正整数,意在考察大数加法,我们可以模拟加法过程并用一个字符串储存结果。而且 ,对于判断当前数是否为回文数,我们可以用reverse函数对其进行颠倒,如若颠倒之后的字符串与原字符串相等,则为回文字符串。详见如下代码。

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string num_add(string num_str) 
{
	string temp=num_str,ans;
	reverse(temp.begin(),temp.end());
	int len=num_str.length(),carry=0;//carry 表示进位
	for(int i=len-1;i>=0;i--)
	{
		
	    int num=(num_str[i]-'0'+temp[i]-'0')+carry;
	    carry=0;
		if(num>=10)
		{
		  carry=1;
		  num=num-10;	
		}
		ans+=to_string(num);	
	} 
	if(carry==1)
	ans+="1";
	reverse(ans.begin(),ans.end());
	return ans; 
}
int main()
{
	string num_str;
	cin>>num_str;
	int step=1;
	while(step<=10)
	{
		string temp=num_str;
		reverse(temp.begin(),temp.end());
		if(temp==num_str)
		{
			cout<<num_str<<" is a palindromic number.";
			break;
		}
		else
		{
			cout<<num_str<<" + "<<temp<<" = "<<num_add(num_str)<<endl;
			num_str=num_add(num_str);
			step++;
		}
	}
	if(step>10) 
	cout<<"Not found in 10 iterations.";
	return 0; 
	
} 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在森林中麋了鹿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值