• 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
  • 相关阅读:
    Java序列化和反序列化
    SSH框架下载地址
    rdf-3x简要使用
    【opencv基础】imread-第二个参数
    【linux基础】查看硬盘位置信息
    【linux基础】重命名文件和文件夹
    【linux基础】生成目录下所有图片的路径
    【linux】wifi不能使用的问题
    【linux基础】ubuntu如何查看linux的内核版本和系统版本
    【error】select timeout问题
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6735274.html
Copyright © 2020-2023  润新知