1136 A Delayed Palindrome (20 分)
Consider a positive integer N written in standard notation with k+1 digits ai as ak ⋯a1 a0 with 0≤ai <10 for all i and ak>0. Then N is palindromic if and only if ai =ak−i for all i. Zero is written 0 and is also palindromic by definition.
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. Such number is called a delayed palindrome. (Quoted from https://en.wikipedia.org/wiki/Palindromic_number )
Given any positive integer, you are supposed to find its paired palindromic number.
Input Specification
Each input file contains one test case which gives a positive integer no more than 1000 digits.
Output Specification
For each test case, print line by line the process of finding the palindromic number. The format of each line is the following:
A + B = C
where A is the original number, B is the reversed A, and C is their sum. A starts being the input number, and this process ends until C becomes a palindromic number – in this case we print in the last line C is a palindromic number.; or if a palindromic number cannot be found in 10 iterations, print Not found in 10 iterations. instead.
Sample Input 1
97152
Sample Output 1
97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.
Sample Input 2
196
Sample Output 2
196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7436
7436 + 6347 = 13783
13783 + 38731 = 52514
52514 + 41525 = 94039
94039 + 93049 = 187088
187088 + 880781 = 1067869
1067869 + 9687601 = 10755470
10755470 + 07455701 = 18211171
Not found in 10 iterations.
题意
本题考查大整数相加以及判断是否为回文数。
若输入的数不是回文数,那么将其逆转再相加,判断和是否为回文数,是则输出,不是则重复上述过程。迭代次数不能超过10次。
PS:注意一开始就要判断输入的数是否为回文数。
另:大整数相加有参考博主:昵称五个字【PAT】A1136 A Delayed Palindrome【大整数相加】
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string a,string b) { //大整数相加
string c=a;
int carry=0,len=a.length(); //carry为进位
for(int i=len-1; i>=0; i--) {
int tmp = (a[i]-'0') + (b[i]-'0') + carry;
c[i] = tmp % 10 + '0';
carry = tmp / 10;
}
if(carry!=0) { //若最后仍有进位,直接加在结果的最前面
c.insert(c.begin(),carry+'0');
}
return c;
}
bool ispnum(string s) {
int j=s.length()-1;
for(int i=0; i<s.length() && j>=0; i++) {
if(s[i]!=s[j]) {
return false;
}
j--;
}
return true;
}
int main() {
string a,b;
cin >> b;
a=b;
reverse(b.begin(),b.end());
string c=add(a,b);
if(ispnum(a)) {
printf("%s is a palindromic number.",a.c_str());
return 0;
}
printf("%s + %s = %s\n",a.c_str(),b.c_str(),c.c_str());
int cnt=1;
while(!ispnum(c) && cnt<10) {
string t2=c;
string t1=t2;
reverse(t2.begin(),t2.end());
c=add(t1,t2);
printf("%s + %s = %s\n",t1.c_str(),t2.c_str(),c.c_str());
cnt++;
}
if(cnt==10 && !ispnum(c)) printf("Not found in 10 iterations.");
else printf("%s is a palindromic number.",c.c_str());
return 0;
}