自测题IV——Have Fun with Numbers (20)

5 篇文章 0 订阅
注意char与int的ASCII转换方法即可。
算法思路:
创建一个统计数组啊count[9][2]={{1,0},{2,0},.......},其中第一个下标存放数字,第二个下标存放对应数字出现的次数。
输入时,读取数字到string类型的num中,然后遍历num,每一个数字在统计数组里对应+1,得到num的统计数组。
二倍处理,注意进位。遍历,每一个数字在统计数组里对应-1,得到num的二倍对比数组。

如果此时count[i][1]均为0,则表明符合。

#include <iostream>
#include <string>
using namespace std;

int main()
{
	int count[9][2],n,tmp=0;//统计数组
	string num;
	cin >> num;
	//统计数组的初始化,将其分别设置为1-9,次数均为0
	for (int i = 0; i < 9; i++)
	{
		count[i][0] = i + 1;
		count[i][1] = 0;
	}
	//每个数字出现的次数统计
	for (int i = 0; i < num.length(); i++)
		count[num[i] - 49][1]++;//减去49字节得到ASCII对应的数,减去49则对应count下标
	//数字的二倍处理
	for (int i = num.length() - 1;i>=0; i--)
	{
		n = 2 * (num[i] - 48);
		if (n+tmp > 9)//大于9的情况
		{
			num[i] = n - 10+tmp+48;//tmp是进位变量,注意加上48
			tmp = 1;
			if (i == 0)//二倍数字位数大于num
			{
				count[0][1]--;//新的位为1
				num = "1" + num;
			}
		}
		else
		{
			num[i] = n+tmp+48;
			tmp = 0;
		}
		count[num[i] - 49][1]--;
	}
	for (n = 0; n < 9; n++)
		if (count[n][1] != 0)
			break;
	cout << (n == 9 ? "Yes" : "No")<<endl;
	cout << num;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值