首先20位说明long long也不行,所以要模拟乘以二的操作。
具体讲一下乘2模拟:
1.将每一位数乘以2的结果对10取余,存到对应位上
2.得出进位数组,即每一位乘2后是不是需要进位
3.对每个需要进的位,他的前一位应该要+1
如下图所示(自己手写的一个):
int cnt[11];
char str[25];
int up[25];//模拟进位的数组
bool check(){
int len = strlen(str);
for(int i=0;i<len;i++)
cnt[str[i]-'0'] ++ ;
//模拟乘2
for(int i=len-1;i>=0;i--){
int temp = (str[i] - '0')*2;
str[i] = temp%10 + '0';
if(temp>=10) up[i] = 1;
}
for(int i=len-1;i>=0;i--){
if(up[i]){
if(i==0){
for(int t=len-1;t>=0;t--)
str[t+1] = str[t];
str[0] = '1';
}else str[i-1] += 1;
}
}
//模拟结束
len = strlen(str);
for(int i=0;i<len;i++){
cnt[str[i]-'0'] -- ;
if(cnt[str[i]-'0']<0) return false;
}
return true;
}
int main(){
scanf("%s",str);
if(check()) printf("Yes\n%s",str);
else printf("No\n%s",str);
return 0;
}