2006浙大火星A+B
Posted vCoders
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2006浙大火星A+B相关的知识,希望对你有一定的参考价值。
- 题目描述:
-
读入两个不超过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 <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=1005; bool isPrime[MAXN]; int prime[MAXN],cnt; void sieve() { memset(isPrime,true,sizeof(isPrime)); for(int i=2;i<=1000;i++) { if(isPrime[i]) { prime[cnt++]=i; for(int j=i+i;j<=1000;j+=i) isPrime[j]=false; } } } char sa[MAXN]; char sb[MAXN]; struct BigInt{ int e[MAXN]; int len; BigInt() { memset(e,0,sizeof(e)); len=0; } BigInt(const char s[]) { memset(e,0,sizeof(e)); len=0; int l=strlen(s); int z=0; for(int i=0;i<l;i++) { if(s[i]==‘,‘) { e[len++]=z; z=0; } else { z*=10; z=z+(s[i]-‘0‘); } } e[len++]=z; for(int i=0;i<len/2;i++) { int t=e[i]; e[i]=e[len-i-1]; e[len-i-1]=t; } } BigInt operator+(const BigInt &t)const { BigInt res; res.len=max(len,t.len); int up=0; int i; for(i=0;i<res.len;i++) { int z=e[i]+t.e[i]+up; res.e[i]=z%prime[i]; up=z/prime[i]; } while(up!=0) { res.e[res.len++]=up%prime[i]; up/=prime[i]; i++; } return res; } void print() { for(int i=len-1;i>=1;i--) { printf("%d,",e[i]); } printf("%d\n",e[0]); } }; int main() { sieve(); while(scanf("%s %s",sa,sb)!=EOF) { BigInt a(sa); BigInt b(sb); if((a.len==1&&a.e[0]==0)||(b.len==1&&b.e[0]==0)) break; BigInt res; res=a+b; res.print(); } return 0; } /************************************************************** Problem: 1016 User: baneHunter Language: C++ Result: Accepted Time:10 ms Memory:1028 kb ****************************************************************/
以上是关于2006浙大火星A+B的主要内容,如果未能解决你的问题,请参考以下文章