北京最大的网站开发公司网络推广软件有哪些
原题
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];
}