[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
网易游戏公司福利 555人发布