*吐槽:这是一道表面字符串,实际上是大数的加法加上一点点散列。
但是我觉得我还是把代码写得太复杂了。*
#include<cstdio>
#include<cstring>
int main(){
char str[25];
int arr1[10];
int arr2[10];
int s[25];
while(scanf("%s",str) != EOF){
memset(arr1,0,sizeof(arr1));
memset(arr2,0,sizeof(arr2));
memset(s,0,sizeof(s));
int len = strlen(str);
int c=0,tmp,i;
for(i=0;i<len;i++){
tmp = str[len-1-i] - '0';
arr1[tmp]++;
s[i] = (2*tmp + c) % 10;
arr2[s[i]]++;
c =(2*tmp + c) / 10;
}
if(c!=0){
s[i]=c;
arr2[s[i]]++;
i++;
}
int j;
for(j=0;j<10;j++){
if(arr1[j] != arr2[j]){
printf("No\n");
break;
}
}
if(j==10) printf("Yes\n");
for(j=0;j<i;j++){
printf("%d",s[i-1-j]);
}
printf("\n");
}
return 0;
}