题目1016:火星A+B

来源:互联网 发布:java的输入输出流 编辑:程序博客网 时间:2024/05/16 04:39
题目描述:
    读入两个不超过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
代码:
#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<string>using namespace std;int prime[30];string a;string b;void getprime(){    int m=3;    int t=2;    prime[0]=1;    prime[1]=2;    while(t<30){        int i=2;        for(;i<m;i++){            if(m%i==0){                break;            }        }        if(i==m){            prime[t]=m;            t++;        }        m++;    }}void getresult(vector<int> num1,vector<int> num2){    reverse(num1.begin(),num1.end());    reverse(num2.begin(),num2.end());    vector<int> result;    int minsize,maxsize;    if(num1.size()<=num2.size()){        minsize=num1.size();maxsize=num2.size();    }else{        minsize=num2.size();maxsize=num1.size();    }    for(int i=minsize;i<maxsize;i++){        if(maxsize==num1.size()){            num2.push_back(0);        }else{            num1.push_back(0);        }    }    int c=0;    for(int i=0;i<maxsize;i++){            result.push_back((num1[i]+num2[i]+c)%prime[i+1]);            c=(num1[i]+num2[i]+c)/prime[i+1];    }    if(c>0){        result.push_back(c);    }    reverse(result.begin(),result.end());    for(int i=0;i<result.size()-1;i++){            cout<<result[i]<<",";    }    cout<<result[result.size()-1]<<endl;}int main(){    getprime();    while(cin>>a>>b && a!="0"&&b!="0"){        vector<int> num1;        vector<int> num2;        int temp=0;        for(int i=0;i<a.length();i++){            if(a[i]!=','){                temp=temp*10+(a[i]-'0');            }else{                num1.push_back(temp);                temp=0;            }        }        num1.push_back(temp);        temp=0;        for(int i=0;i<b.length();i++){            if(b[i]!=','){                temp=temp*10+(b[i]-'0');            }else{                num2.push_back(temp);                temp=0;            }        }        num2.push_back(temp);        getresult(num1,num2);    }    return 0;}


原创粉丝点击