前言

传送门

正文


参考题解

#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;
}