二倍操作:因为数字比较大所以用字符串处理,从字符串末尾开始计算,需要一个变量(carry)来记录进位
然后用一个数组分别计算每个数字出现的频率,对比处理前后的数组是否相同即可
代码:
#include <iostream>
#include<stdio.h>
#include<string>
using namespace std;
#define ll long long
int initarr[10] = {0};
int doublearr[10] = {0};
void doubleit(string& str)
{
string finstr="";
int len = str.size();
int carry = 0;
for(int i = len - 1;i >= 0;i--)
{
int res = 2*(str[i]-'0') + carry;
if(res < 10)
{
char tmp = res + '0';
finstr = tmp + finstr;
carry = 0;
}
else
{
char tmp = res%10 + '0';
finstr = tmp + finstr;
carry = 1;
}
}
if(carry > 0)
{
finstr = '1' + finstr;
}
str = finstr;
}
int main()
{
char input[21];
string inputnum;
scanf("%s",input);
inputnum = input;
for(int i = 0;i<inputnum.size();i++)
{
initarr[inputnum[i] - '0']++;
}
doubleit(inputnum);
for(int i = 0;i<inputnum.size();i++)
{
doublearr[inputnum[i] - '0']++;
}
for(int i = 0;i<10;i++)
{
if(initarr[i] != doublearr[i])
{
printf("No\n");
printf("%s",inputnum.c_str());
return 0;
}
}
printf("Yes\n");
printf("%s",inputnum.c_str());
return 0;
}