zoukankan      html  css  js  c++  java
  • 2006浙大火星A+B

    题目描述:
        读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
    输入:
        测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
    输出:
        对每个测试用例输出1行,即火星表示法的A+B的值。
    样例输入:
    1,0 2,1
    4,2,0 1,2,0
    1 10,6,4,2,1
    0 0
    样例输出:
    1,0,1
    1,1,1,0
    1,0,0,0,0,0

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAXN=1005;
    bool isPrime[MAXN];
    int prime[MAXN],cnt;
    void sieve()
    {
        memset(isPrime,true,sizeof(isPrime));
        for(int i=2;i<=1000;i++)
        {
            if(isPrime[i])
            {
                prime[cnt++]=i;
                for(int j=i+i;j<=1000;j+=i)
                    isPrime[j]=false;
            }
        }
    }
    char sa[MAXN];
    char sb[MAXN];
    struct BigInt{
        int e[MAXN];
        int len;
        BigInt()
        {
            memset(e,0,sizeof(e));
            len=0;
        }
        BigInt(const char s[])
        {
            memset(e,0,sizeof(e));
            len=0;
            int l=strlen(s);
            int z=0;
            for(int i=0;i<l;i++)
            {
                if(s[i]==',')
                {
                    e[len++]=z;
                    z=0;
                }
                else
                {
                    z*=10;
                    z=z+(s[i]-'0');
                }
            }
            e[len++]=z;
            for(int i=0;i<len/2;i++)
            {
                int t=e[i];
                e[i]=e[len-i-1];
                e[len-i-1]=t;
            }
         
        }
        BigInt operator+(const BigInt &t)const
        {
            BigInt res;
            res.len=max(len,t.len);
            int up=0;
            int i;
            for(i=0;i<res.len;i++)
            {
                int z=e[i]+t.e[i]+up;
                res.e[i]=z%prime[i];
                up=z/prime[i];
            }
            while(up!=0)
            {
                res.e[res.len++]=up%prime[i];
                up/=prime[i];
                i++;
            }
            return res;
        }
        void print()
        {
            for(int i=len-1;i>=1;i--)
            {
                printf("%d,",e[i]);
            }
            printf("%d
    ",e[0]);
        }
    };
    int main()
    {
        sieve();
        while(scanf("%s %s",sa,sb)!=EOF)
        {
            BigInt a(sa);
            BigInt b(sb);
            if((a.len==1&&a.e[0]==0)||(b.len==1&&b.e[0]==0))
                break;
            BigInt res;
            res=a+b;
            res.print();
        }
        return 0;
    }
    /**************************************************************
        Problem: 1016
        User: baneHunter
        Language: C++
        Result: Accepted
        Time:10 ms
        Memory:1028 kb
    ****************************************************************/
  • 相关阅读:
    day 7-5 守护线程
    小练习:思考下述代码的执行结果有可能是哪些情况?为什么?
    深浅copy详解
    练习题,使用多线程编写一个简单的文本处理工具
    harbor搭建v1.8.3
    mysql常用命令
    windows安装MySQL
    centos用户和用户组的管理及简单操作
    CentOS 7下安装谷歌浏览器
    typecho管理员修改密码
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5500025.html
Copyright © 2011-2022 走看看