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

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

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

#include 
#include 
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")<


你可能感兴趣的:(C++,PAT)