前言
正文
参考题解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/* 题意:判断,对于一个不超过20位的数字字符串,将其数值乘2之后得到的结果 值是否只是原有数字字符串中的每个数字字符排列顺序不同。 思路:本题实质就是大整数加分,使用模板即可 */
vector<int> v;
int lenA,lenR;
string bigAdd(string a){
string res;
int k=0;
for(int i=lenA-1;i>=0;i--)v.push_back(a[i]-'0');
for(int i=0;i<v.size();i++){
if(v[i]*2+k>=10){
res+=(2*v[i]+k)-10+'0';
k=1;
}else{
res+=(2*v[i]+k)+'0';
k=0;
}
}
if(k==1)res+='1';//最高位
reverse(res.begin(),res.end());//注意换回原先的顺序
return res;
}
int hashTable[10];
int main(){
fill(hashTable,hashTable+10,0);
string a,res;
cin>>a;
lenA=a.size();
res=bigAdd(a);
lenR=res.size();
bool flag=true;
if(lenA==lenR){//两个字符串长度相等
//可以排序后依次比较或者也可以使用hashTable记录每个数字出现的次数
for(int i=0;i<lenA;i++){
hashTable[a[i]-'0']++;
}
for(int i=0;i<lenR;i++){
hashTable[res[i]-'0']--;
}
for(int i=1;i<=9;i++){
if(hashTable[i]!=0){
flag=false;
break;
}
}
if(flag)cout<<"Yes\n"<<res<<endl;
else cout<<"No\n"<<res<<endl;
} else cout<<"No\n"<<res<<endl;
return 0;
}