admin 管理员组文章数量: 1087817
九度OJ 1016
- 题目描述:
- 读入两个不超过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
#include<iostream> #include<string> #include<sstream> #include<vector> #include<algorithm> using namespace std; vector<int> a,b,c;//a用来存的是A,b用来存的是B,c用来存的是和。动态; string A,B; int p[30]= {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,101,103,107,109,113 };//偷个懒,直接列出素数数组,不写了void toint() { a.clear();b.clear();for( int i=0; i<A.length(); i++){if(A[i]==',')A[i]=' ';}for( int i=0; i<B.length(); i++){if(B[i]==',')B[i]=' ';}int v;istringstream str1(A);//istringtream是一个string对象构造来的,istringtream类从一个//string对象读取字符字符串构造字符串流的时候,空格会造成字符串参数的内部分界。利用分解获取//的方法实际完成了到整型对象的转换。while(str1>>v){a.push_back(v);//对a赋值}istringstream str2(B);while(str2>>v){b.push_back(v);}reverse(a.begin(),a.end());reverse(b.begin(),b.end()); } void get()//开始相加 { c.clear();int carry=0;int la=a.size();int lb=b.size();int v=0;for( int i=0; i<(la>lb?la:lb); i++){if(i>=la)v=b[i]+carry;else if(i>=lb)v=a[i]+carry;elsev=a[i]+b[i]+carry;c.push_back(v%p[i]);carry=v/p[i];if(i==(la>lb?la:lb)-1&&carry!=0){c.push_back(carry);}}reverse(c.begin(),c.end());//相加完要反转;for( int i=0;i<c.size();i++){//别输出多了。if(i==c.size()-1){cout<<c[i]<<endl;break;}cout<<c[i]<<",";}} int main() {while(cin>>A>>B&&A!="0"&&B!="0"){toint();get();}return 0;}/**************************************************************Problem: 1016User: royeLanguage: C++Result: AcceptedTime:10 msMemory:1552 kb ****************************************************************/
本文标签: 九度OJ1016
版权声明:本文标题:九度OJ1016 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1700276113a375867.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论