1,輸入的數最長有20位,即使用long long 類型 的數也不夠,所以用字符串處理
2,注意double之後數字位數變長一位的情況(5*2=10),即乘2算完之後進位標誌carry爲1,不要把最高位的數字忘了。
#include <iostream>
#include <string.h>
using namespace std;
int first[10],second[10];
void countDigits(char* a,int b[])
{
int len=strlen(a);
for(int i=0;i<len;i++)
{
int num = a[i]-'0';
b[num]++;
}
}
int main()
{
freopen("E:/data/1023.txt","r",stdin);
char num[22],num2[22];
cin>>num;
fill(first,first+10,0);
fill(second,second+10,0);
countDigits(num,first);
int len=strlen(num);
int carry=0,index=0;
char temp[22];
for(int i=len-1;i>=0;i--)
{
int digit=num[i]-'0',d2=0;
digit=digit*2+carry;
if(digit>9)
{
d2=digit%10;
carry = digit/10;
}
else
{
carry =0;
d2=digit;
}
char ch=(char)d2+'0';
temp[index]=ch;
index++;
}
if(carry>0)
{
char ch=(char)carry+'0';
temp[index++]=ch;
carry=0;
}
int p=0;
for(int i=index-1;i>=0;i--)
{
num2[p]=temp[i];
p++;
}
num2[index]='\0';
if(index>len)
{
cout<<"No"<<endl<<num2<<endl;
return 0;
}
countDigits(num2,second);
int success=1;
for(int i=0;i<10;i++)
{
if(first[i]!=second[i])
{
success=0;
}
}
if(success==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
cout<<num2<<endl;
return 0;
}