题目
题解
#include<iostream>
#include<cstring>
using namespace std;
int book[10];
int main(){
char num[22];
scanf("%s",num);
int flag=0;
int len=strlen(num);//strlen()是函数,测量字符实际长度,sizeof是运算符,测量字符的分配大小
for(int i=len-1;i>=0;i--){
int temp=num[i]-'0';
book[temp]++;
temp=temp*2+flag;
flag=0;
if(temp>=10) {
temp-=10;
flag=1;
}
num[i]=temp+'0';
book[temp]--;
}
int flag1=0;
for(int i=0;i<10;i++){
if(book[i]!=0) flag1=1;
}
printf("%s",(flag==1||flag1==1)?"No\n":"Yes\n");
if(flag==1) printf("1");//一开始把条件写成flag1,错了
printf("%s",num);
return 0;
}
这题不难。首先long long只能大概表示18位,可能会超过。所以用字符数组。老惯例转成数字再处理。一个符号标志判断进位,一个判断。所有数字的统计book[i]是否都为0,都为0则所组成数字完全一样。
有进位则肯定不一样。
字符串以‘\0’结尾,strlen求字符的实际长度。