1023 Have Fun with Numbers (20分)
题目链接:PAT A 1023
题目大意:给出一个不超过20位的整数n,要求将这个数乘以2,然后于原始数作比较看看是否有新增的数字,有则输出Yes,没有则输出No。还要输出乘以2后的数。
思路分析:由于最大的数可能有20位,所以不能定义一般的整型变量int,long long int也不能解决问题,所以涉及到大整数运算的知识点。我们定义一个字符串s来接收输入,然后将每一位数字用数组存储起来。定义一个变量cnt初始为0,从这个数的个位开始,每一位都乘以2加上cnt存储在答案数组里,如果有进位则要使得cnt为1。然后将答案数组中的数字在输入到字符串中,之后统计看看有没有多出来的数字,最后输出即可。
注意:如果最高位乘完后进位不为0,需要在最高位补1,例如999*2,最高位就需要补1。
AC代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
string s, temp;
cin >> s;
vector<int> v, ans;
for(int i = 0; i < s.size(); i++) //将字符串转化到数组中
v.push_back(s[i] - '0');
int cnt = 0, num[10] = {0}, check[10] = {0};
for(int i = v.size() - 1; i >= 0; i--) {
if(v[i] * 2 >= 10) { //说明存在进位
ans.push_back(v[i] * 2 - 10 + cnt);
cnt = 1;
}
else { //不存在进位
ans.push_back(v[i] * 2 + cnt);
cnt = 0;
}
num[v[i]] = 1; //如果某个数字存在,num数组中值赋值为1
}
if(cnt != 0) //进位不为0则补充1
ans.push_back(1);
for(int i = ans.size() - 1; i >= 0; i--) //转换到字符串中
temp += ans[i] + '0';
for(int i = 0; i < temp.size(); i++) //统计乘2以后的数字
check[temp[i] - '0'] = 1;
for(int i = 0; i < 10; i++) {
if(num[i] != check[i]) {
cout << "No" << endl;
cout << temp;
return 0;
}
}
cout << "Yes" << endl;
cout << temp;
return 0;
}