每日一九度之题目1016:火星A+B
Posted Asimple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一九度之题目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==‘\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 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\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,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
以上是关于每日一九度之题目1016:火星A+B的主要内容,如果未能解决你的问题,请参考以下文章