首页 > 代码库 > 每日一九度之题目1016:火星A+B

每日一九度之题目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,14,2,0 1,2,01 10,6,4,2,10 0
样例输出:
1,0,11,1,1,01,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 100000using 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==\n) 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\n",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 100000using 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\n":"%d,",sum[k]);        }    }    return 0;}

 

时间限制: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,14,2,0 1,2,01 10,6,4,2,10 0
样例输出:
1,0,11,1,1,01,0,0,0,0,0

每日一九度之题目1016:火星A+B