zoukankan      html  css  js  c++  java
  • 每日一九度之题目1016:火星A+B

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:5346

    解决:1464

    题目描述:
        读入两个不超过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

    一开始看到题目,其实我是蒙 bility的

    后来看到大神的讲解之后才明白是个怎么的解法。

    其实和大整数的加法差不多,只是进制是不停在变的。最开始是用的字符串做的,前面两组数据过了,但是,后面那组出现了问题,没有考虑到两位数字的情况。

    但是如果要考虑两个数字,那样用字符串做便显得很麻烦,于是就用数组做了,真的简单很多。。

    代码如下:

    //Asimple
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cctype>
    #include <cstdlib>
    #include <stack>
    #include <cmath>
    #include <string>
    #include <queue>
    #define INF 100000
    using namespace std;
    const int maxn = 105;
    typedef long long ll ;
    int n, m;
    int p[26]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
    int a[26],b[26],sum[26];
    
    int main(){
        int m,n,i,j,k,add,x,y,max;
        char c;
        while( true ){
            for(i=0;i<=25;i++){
                a[i]=0;
                b[i]=0;
                sum[i]=0;
            }
            for(i=1;i<=25;i++){
                scanf("%d",&a[i]);
                scanf("%c",&c);
                if(c==' ') break;
            }m=i;
            for(i=1;i<=25;i++){
                scanf("%d",&b[i]);
                scanf("%c",&c);
                if(c=='
    ') break;
            }n=i;
            if(a[1]==0&&b[1]==0)break;
            k=m>n?m:n;
            for(i=1,add=0,max=k;i<=max;i++){
                if(m>=1)x=a[m--];
                else x=0;
                if(n>=1)y=b[n--];
                else y=0;
                sum[k--]=(x+y+add)%p[i];
                add=(x+y+add)/p[i];
            }
            sum[0]=add;
            if(sum[0]!=0) printf("%d,",sum[0]);
            for(i=1;i<max;i++) printf("%d,",sum[i]);
            printf("%d
    ",sum[max]);
        }
        return 0;
    }

    贴上我用字符串做的代码,想改的可以尝试下:

    //Asimple
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cctype>
    #include <cstdlib>
    #include <stack>
    #include <cmath>
    #include <string>
    #include <queue>
    #define INF 100000
    using namespace std;
    const int maxn = 105;
    typedef long long ll ;
    int n, m;
    char s1[maxn], s2[maxn];
    int a[26] = {2,3,5,7,11,13,17,19,23,
                 29,31,37,41,43,47,53,59,
                 61,67,71,73,79,83,89,97};
    int sum[maxn];
    
    int main(){
        while( ~ scanf("%s %s",s1,s2) ){
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            if( len1 == 1 && s1[0] == '0' && len2 == 1 && s2[0] == '0' ) break;
            n = 0;
            int c = 0;
            int i = len1-1;
            int j = len2-1;
            for(; i>=0&&j>=0; i--,j--){
                if( isdigit(s1[i]) && isdigit(s2[j]) ){//改这里 :改成能够判断多位数字 
                    sum[n] = (s1[i]-'0') + (s2[j]-'0')  + c;
                    if( (s1[i]-'0') + (s2[j]-'0') + c >= a[n] ){
                        c = 1 ;
                        sum[n] -= a[n];
                    } else {
                        c = 0 ;
                    }
                    n ++ ;
                }
            }
            for(; i>=0; i--){
                if( isdigit(s1[i]) ){//改这里 :改成能够判断多位数字 
                    sum[n] = s1[i] - '0' + c;
                    if( s1[i] - '0' + c >= a[n] ){
                        c = 1 ;
                        sum[n] -= a[n];
                    } else {
                        c = 0 ;
                    }
                    n ++ ;
                }
            }
            for(; j>=0; j--){
                if( isdigit(s2[j]) ){//改这里 :改成能够判断多位数字 
                    sum[n] = s2[j] - '0' + c;if( s2[j] - '0' + c >= a[n] ){
                        c = 1;
                        sum[n] -= a[n];
                    } else {
                        c = 0 ;
                    }
                    n ++ ;
                }
            }
            if( c == 1 ){
                sum[n] = 1 ;
                n ++ ;
            }
            for(int k=n-1; k>=0; k--){
                printf(k==0?"%d
    ":"%d,",sum[k]);
            }
        }
        return 0;
    }
    低调做人,高调做事。
  • 相关阅读:
    Broadcom BCM94352z/DW1560驱动新姿势
    amd显卡更新最新驱动鼠标顿卡的解决方法
    设置 P2415Q & P2715Q 显示器使其支持 HDMI 2.0 启用 4k@60hz
    Web基础之Redis
    前端基础之AJAX
    Java基础之枚举
    解决Tomcat在idea控制台乱码问题
    JQuery基础
    JavaScript基础笔记
    前端基础之Html、CSS
  • 原文地址:https://www.cnblogs.com/Asimple/p/5827624.html
Copyright © 2011-2022 走看看