Consider a positive integer N written in standard notation with k+1 digits ai as ak⋯a1a0 with 0 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.
#include<iostream> #include<algorithm> #include<string.h> using namespace std; typedef struct NODE{ int num[1010], len; NODE(){ fill(num, num + 1010, 0); len = 0; } }bign; void add(bign &a, bign &b, bign &c){ c.len = 0; b.len = 0; for(int i = a.len - 1; i >= 0; i--){ b.num[b.len++] = a.num[i]; } int carry = 0; int i; for(i = 0; i < b.len && i < a.len; i++){ int sum = a.num[i] + b.num[i] + carry; carry = sum / 10; c.num[c.len++] = sum % 10; } while(i < b.len){ int sum = carry + b.num[i]; c.num[c.len++] = sum % 10; carry = sum / 10; } while(i < a.len){ int sum = carry + a.num[i]; c.num[c.len++] = sum % 10; carry = sum / 10; } if(carry != 0){ c.num[c.len++] = carry; } } int isReverse(bign a){ for(int i = 0, j = a.len - 1; i <= j; i++, j--){ if(a.num[i] != a.num[j]) return 0; } return 1; } int main(){ char ss[1000]; scanf("%s", ss); bign a, b, c; for(int i = strlen(ss) - 1; i >= 0; i--){ a.num[a.len++] = ss[i] - '0'; } int tag = 0; if(isReverse(a)){ for(int i = a.len - 1; i >= 0; i--){ printf("%d", a.num[i]); } printf(" is a palindromic number."); return 0; } for(int i = 0; i < 10; i++){ add(a,b,c); for(int k = a.len - 1; k >= 0; k--){ printf("%d", a.num[k]); } printf(" + "); for(int k = b.len - 1; k >= 0; k--){ printf("%d", b.num[k]); } printf(" = "); for(int k = c.len - 1; k >= 0; k--){ printf("%d", c.num[k]); } printf(" "); if(isReverse(c)){ tag = 1; for(int j = c.len - 1; j >= 0; j--){ printf("%d", c.num[j]); } printf(" is a palindromic number."); break; }else{ for(int k = 0; k < c.len; k++){ a.num[k] = c.num[k]; } a.len = c.len; } } if(tag == 0){ printf("Not found in 10 iterations. "); } cin >> ss; return 0; }
总结:
1、大整数相加的问题。要注意的是,在a+b做完之后,要注意检查carry是否为0,如果不为0的话,需要再把carry加上。
2、1230的相反是0123而不是123,所以本题相当于两个待加的数字位数都相同,所以可以直接用两个string做加法,比使用大整数模拟要快一些。