PAT甲级(Advanced Level) Practice 1023 Have Fun with Numbers
原题
1023 Have Fun with Numbers - PAT (Advanced Level) Practice
题目大意
输入一个不大于20位的数,判断该数乘2后所用的每个数字数量和原数是否一样。
解题思路
因为这个数最大可能达到20位,超出了long long的范围,因此我们考虑大数乘法,用vector数组倒序存储该数。用数组digit[]统计每个数字出现的次数,最后将乘2的结果中每个数字统计一遍即可。
代码(c++)
#include <bits/stdc++.h>
#include <vector>
using namespace std;
string s;
vector<int> num;
int digit[10] = {0};
vector<int> mul(vector<int> num, int k) { // 大数乘小数
vector<int> res;
int count = 0; // count表示进位
for(int i : num) {
int x = i * k + count;
count = x / 10;
res.push_back(x % 10);
}
if(count) res.push_back(count); // 若最后还有进位,补上
return res;
}
bool check(vector<int> num2) { // 统计每个数字出现次数是否相等
for(int i : num2) digit[i]--; // digit所有都为0时表示全部相等
for(int i :digit) if(i) return false;
return true;
}
int main() {
cin >> s;
for(int i = s.size() - 1; i >= 0; i--) {
int t = s[i] - '0';
digit[t]++;
num.push_back(t);
}
vector<int> num2 = mul(num, 2);
if(check(num2)) puts("Yes");
else puts("No");
for(int i = num2.size() - 1; i >= 0; i--) cout << num2[i];
}