#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string> #include<algorithm> #include<map> #include<vector> #include<queue> #include<memory.h> //PS:缺少上面这个头文件,memset会报错,或者用string.h那个 using namespace std; //key:count[]存放0~9每个数字出现次数,原整数出现的数字令其对应count[k]+1 //新整数出现的数字令其对应count[k]-1,最后看count[]是否全0 struct bign{ int d[21]; int len; bign(){ //构造函数 memset(d,0,sizeof(d)); len=0; } }; bign change(string str){ //以字符串型读入整数,转换成bign bign a; a.len=str.length(); for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-i-1]-'0'; } return a; } bign multi(bign a,int b){ //高精度乘法 bign c; int carry=0; //进位 for(int i=0;i<a.len;i++){ int temp=a.d[i]*b+carry; c.d[c.len++]=temp%10; //个位作为该位的结果 carry=temp/10; //高位部分作为新的进位 } while(carry!=0){ //和加法不一样,乘法的进位可能不止1位,因此用while c.d[c.len++]=carry%10; carry/=10; } return c; } bool Judge(bign a,bign b){ //判断b的所有位是否是a的某个排列 if(a.len != b.len) return false; //若长度不同,则肯定是false int count[10]={0}; //计数0~9的出现次数 for(int i=0;i<a.len;i++){ count[ a.d[i] ]++; //数位a.d[i]对应的count值加1 count[ b.d[i] ]-- ; //数位b.d[i]对应的count值减1 } for(int i=0;i<10;i++){ //判断0~9出现次数是否都为0 if(count[i]!=0){ //只要有一个数字的出现次数不为0,则返回false return false; } } return true; } void print(bign a){//输出bign for(int i=a.len-1;i>=0;i--){ printf("%d",a.d[i]); } } int main(){ string str; getline(cin,str); bign a=change(str); //转换为bign bign mul=multi(a,2); //计算a*2 if(Judge(a,mul) == true ) printf("Yes\n"); else printf("No\n"); print(mul); //输出结果 system("pause"); return 0; }