题目
题目大意
一个数乘以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和测试点7string 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;
}