PAT甲级-1023 Have Fun with Numbers
题目
题目大意
一个数乘以2倍后,仍由原来的数字组成,只不过顺序发生变化,就输出Yes,否则输出No。并输出乘以2部后的数。
思路
题目说数字不超过20位,long long最多只能表示19位,93....,超过其范围。求2倍,则为大数加法。因此用字符串存数字。因为每次进位最多只能进一位,所以可以用isadd表示是否产生进位,从最低位开始计算。最后将计算结果用reverse翻转即可。比较两个字符串所含字符是否一致,可以for循环一位位比较,确认一位就删除一位,循环后验证该字符串是否为空,如果为空,则说明一致。也可以用sort排序,然后比较是否相等,不过要放到vector数组中,比较麻烦。
注意计算首位加法,如果进位,就跳出了for循环,所以要再循环外放一个isadd的if语句,如果进位,res再加‘1’。测试点2和测试点7考察的就是这个地方。
代码
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
int main(){
string s;
cin >> s;
string res = "";
bool isadd = false;
for (int i = (int)s.size() - 1; i >= 0; i--){
if (isadd){
res += ((s[i] - '0') * 2 + 1) % 10 + '0';
}else{
res += (s[i] - '0') * 2 % 10 + '0';
}
if (s[i] - '0' >= 5){
isadd = true;
}else{
isadd = false;
}
}
if (isadd) res += '1'; // 注意首位进位,测试点2和测试点7
string res2 = res;
reverse(res2.begin(), res2.end());
for (int i = 0; i < (int)s.size(); i++){
if (res.find(s[i]) != -1){
res.erase(res.find(s[i]), 1);
}
}
if (res == ""){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
cout << res2 << endl;
return 0;
}