题目1016:火星A+B

来源:互联网 发布:cctv下载网络电视下载安装 编辑:程序博客网 时间:2024/05/16 06:01
题目1016:火星A+B

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5698

解决:1564

题目描述:
    读入两个不超过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
来源:
2006年浙江大学计算机及软件工程研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7740-1-1.html

思路:开始对这种进制是比较懵逼的,比如38其实相当于1*(5*3*2)+1*(3*2)+1*(2)+0*2,这其实不了解也是可以的,直接对给出的火星数相加进位即可。需要注意的是最高位有进位的时候需要考虑一下。

#include <iostream>#include <cmath>#include <string>#include <fstream>using namespace std;int prime[26]={2,3,5,7,11,13,17,19,23};//素数集合 int A[30];  //存放结果的 void creat();  //求前25个素数 int main(){ifstream in;in.open("2.txt");string str1,str2;creat();while(in>>str1>>str2 && str1!="0" && str2!="0"){ int c_a=str1.length()-1;;int c_b=str2.length()-1;;int a=0;//字符串1','号之间的数值 int b=0;//字符串2','号之间的数值 int index=0;//进位 int count=0;//存储结果 int bit=0;//记录','之间数字的位数 while(c_a>=0 || c_b>=0)//求等长字符串相加的结结果 {while(str1[c_a]!=',' && c_a>=0){a=a+(str1[c_a]-'0')*pow(10,bit);--c_a;++bit;}bit=0;while(str2[c_b]!=',' && c_b>=0){b=b+(str2[c_b]-'0')*pow(10,bit);--c_b;++bit;}A[count]=(a+b+index)%prime[count];index=(a+b+index)/prime[count];++count;--c_a;--c_b;a=0;b=0;bit=0;}if(index!=0)//向最高位有进位的处理,这个处理还挺重要,当时就是这里处理问题搞了大半天 {A[count]=index;++count;}for(int i=count-1;i>=1;i--)cout<<A[i]<<",";cout<<A[0]<<endl;}return 0;}void creat() {int num=29;int j=9;while(j<=25){int i;while(true){for(i=2;i<=num;i++){if(num%i==0)break;}if(i==num)break;else num+=2;}prime[j]=num;++j;num+=2;}}


0 0