[PAT解题报告] Have Fun with Numbers
简单题, 给定一个整数(20位),问他的二倍是否和它组成的数字相同。
由于整数已经超过了long long, C++用数组模拟大整数加法,java可以直接使用bigInteger。
数组模拟整数加法,就是每个数组存一位数,就像我们笔算加法一样,注意进位就可以了。然后数组里面每一位就是结果。
比较数字显然可以排序,另外一种办法是记录每种数字(0-9)出现的次数之差,最后如果全0,显然就是组成的数字相同了。
代码:
#include <cstdio> #include <cstring> #include <string> using namespace std; char s[100]; int a[100],b[100],num[10];; int main() { scanf("%s",s); int n = strlen(s); for (int i = 0; i < n; ++i) { a[i] = s[n - 1 - i] - '0'; } for (; n && (a[n - 1] == 0); --n) ; for (int i = 0; i < n; ++i) { b[i] += (a[i] << 1); if (b[i] >= 10) { b[i] -= 10; ++b[i + 1]; } ++num[a[i]]; --num[b[i]]; } if (b[n]) { --num[b[n++]]; } bool mark = true; for (int i = 0; i < 10; ++i) { if (num[i]) { mark = false; } } puts(mark?"Yes":"No"); for (--n; n >= 0; --n) { printf("%d",b[n]); } puts(""); return 0; }
原题链接: http://www.patest.cn/contests/pat-a-practise/1023