题目链接:点击查看
题目描述:
给定一个 k+1 位的正整数 N,写成 ak⋯a1a0 的形式,其中对所有 i 有 0≤ai<10 且 ak>0。N 被称为一个回文数,当且仅当对所有 i 有 ai=ak−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;
}