首页 > 代码库 > 每日一九度之题目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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。