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