Solution:
这道题的意思是给出一个长度不超过20的长整数num1,将其乘以2,得到一个新的长整数num2。在num2中,如果所有位的数的一个排列和num1相等,则输出“Yes”,否则输出“No”。其实就是num1中每种数字的个数和num2必须相等。我们用数组cnt[10]记录num1中每个数字出现的次数,然后将其乘以2,再把num2中每种数字出现的次数减掉,若最终cnt中的元素全部为0,则输出“Yes”,反之输出“No”。
代码如下:
//高精度数的乘法
#include<iostream>
#include<string>
using namespace std;
string s;//初始字符串
int cnt[10];//记录每个数字出现的次数
int main(){
cin>>s;
int jw=0;//进位
for(int i=0;i<10;i++){
cnt[i]=0;
}
for(int i=s.length()-1;i>=0;i--){
int num=s[i]-'0';
cnt[num]++;//将原来的数字个数+1
int temp=num*2+jw;//乘以2后的数字
if(temp>=10){//若存在进位
temp-=10;
jw=1;
}else{//不存在进位
jw=0;
}
cnt[temp]--;//将个数减1
s[i]=temp+'0';
}
int flag=true;
for(int i=0;i<10;i++){
if(cnt[i]){
flag=false;
break;
}
}
if(flag){
cout<<"Yes"<<endl;
if(jw==1){
cout<<1;
}
cout<<s;
}else{
cout<<"No"<<endl;
if(jw==1){
cout<<1;
}
cout<<s;
}
return 0;
}