【题目大意】
给一个数字N,使其与自身的逆序数相加,问能否在K次内,得到一个回文数(Palindromic Number)。
【思路】
用string、数组相加即可。
【坑】
如果N就是回文数,则输出次数是0次。
【tips】
翻转两个数可以用reverse函数。这里可以只用string,不用数组,简少代码量。
string s=a;
reverse(s.begin(),s.end());
一开始需要判断N本身是否为回文数,则判断回文数的操作应该放在循环一进去的时候;又由于数字本身与翻转后的结果相等即“回文”,因此直接用翻转后的结果与本身比较,如果相等就退出循环,否则直接二者相加即可。
【AC代码】
1 用string+数组解决,较为繁琐。
#include<iostream> #include<string> #include <algorithm> using namespace std; #define N 10000 int main() { string input; cin >> input; int times; cin >> times; if (times == 0) { cout << input << endl; cout << 0; return 0; } int i, k; int num[N], dnum[N]; int digit = input.size(); for (i = 0; i < digit; i++) { num[i] = input[i] - '0'; dnum[digit - i - 1] = num[i]; } int ans[N]; for (k = 0; k < times; k++) { bool jinwei = 0;//进位标志 for (i = 0; i < digit / 2; i++) if (num[i] != num[digit - i - 1]) break; if (i == digit / 2) break; for (i = 0; i < digit; i++) { ans[i] = num[i] + dnum[i] + jinwei; if (ans[i] >= 10) { ans[i] -= 10; jinwei = 1; } else jinwei = 0; } if (jinwei == 1) { ans[digit] = 1; digit++; } for (i = 0; i < digit; i++) { dnum[i] = ans[i]; num[digit - i - 1] = dnum[i]; } } for (i = digit - 1; i >= 0; i--) cout << dnum[i]; cout << endl; if (k < times)cout << k; else cout << times; return 0; }
2 简化:用string,翻转用reserve函数。
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 using namespace std; 5 string add(string a, string b) 6 { 7 int tmp = 0;//进位标志 8 string c = a; 9 for (int i = b.length() - 1; i >= 0; i--) 10 { 11 c[i] = (a[i] - '0' + b[i] - '0' + tmp) % 10 + '0'; 12 if ((a[i] - '0' + b[i] - '0' + tmp) < 10) 13 tmp = 0; 14 else 15 tmp = 1; 16 } 17 if (tmp == 1) 18 c = '1' + c; 19 return c; 20 } 21 int main() 22 { 23 string a; 24 int k; 25 cin >> a >> k; 26 int c;//c保存迭代的次数 27 for (c = 0; c < k; c++) { 28 string s = a; 29 reverse(s.begin(), s.end()); 30 if (a == s)//判断是否是回文数 31 break; 32 a = add(a, s); 33 } 34 cout << a << endl << c << endl; 35 return 0; 36 }