PAT甲题题解-1023. Have Fun with Numbers (20)-大数加法

和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;
}
View Code
原文地址:https://www.cnblogs.com/chenxiwenruo/p/6735274.html