和1024一样都是大数据的题,因为位数最多要20位,long long最多19位
给一个num,求sum=num+num
问sum包含的数字,是否是num的一个排列,即数字都一样,只是顺序不同罢了。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <string> using namespace std; const int maxn=205; struct Bign{ int len,num[maxn]; // 这里num[0]是最低位,num[len-1]是最高位 Bign(){ memset(num,0,sizeof(num)); len=1; } Bign(int val){ *this=val; } Bign(const char*val){ *this=val; } //以int型赋值 Bign operator=(int val){ char s[maxn]; sprintf(s,"%d",val); *this=s; //字符串赋值 return *this; } //以字符串赋值 Bign operator=(const char*val){ len=strlen(val); for(int i=0;i<len;i++){ num[i]=val[len-1-i]-'0'; } return *this; } //去掉前导0 void clean(){ while(len>1&&!num[len-1]){ len--; } } //转化为字符串 string tostr(){ string res=""; clean(); for(int i=0;i<len;i++){ res=(char)(num[i]+'0')+res; } if(res=="") return "0"; return res; } //重载+ Bign operator+(const Bign& b)const{ Bign c; c.len=0; for(int i=0,g=0;g||i<max(len,b.len);i++){ int x=g; if(i<len) x+=num[i]; if(i<b.len) x+=b.num[i]; c.num[c.len++]=x%10; g=x/10; } return c; } //取翻转后的数 Bign toReverse(){ clean(); Bign c; c.len=len; for(int i=0;i<len;i++){ c.num[i]=num[len-1-i]; } return c; } }; int main() { char str[25]; scanf("%s",str); Bign num=str; Bign sum=num+num; int vis1[10],vis2[10]; memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); for(int i=0;i<num.len;i++){ vis1[num.num[i]]=1; } for(int i=0;i<sum.len;i++){ vis2[sum.num[i]]=1; } bool flag=true; for(int i=0;i<10;i++){ if(vis1[i]!=vis2[i]){ flag=false; } } if(flag){ printf("Yes "); } else{ printf("No "); } string s=sum.tostr(); cout<<s<<endl; return 0; }