PAT甲级 1023 Have Fun with Numbers (20分)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值