http://ac.jobdu.com/problem.php?pid=1016
// 浙大2006年机试
// 九度:1016
// 题目:火星A+B
//
// 考察:进制的本质
//
//
//
//
//
//
//
#include <stdio.h>
#include <cctype>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#define SIZE 30
using namespace std;
int prime[SIZE];
int a[SIZE] , b[SIZE];
int la, lb;
bool IsPrime(int x)
{
if(x == 2)
return true;
int y = sqrt(x);
for(; x % y != 0; y--)
;
return y == 1;
}
void InitPrime()
{
int pos = 0;
for(int i=2; i<1000; i++)
{
if(IsPrime(i))
{
prime[pos++] = i;
//printf("pos[%d]%d\n",pos, i);
}
if(pos> SIZE-1)
break;
}
}
void InPut()
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
la = lb =0;
int x;
char c;
while(1)
{
scanf("%d%c", &x, &c);
a[la++] = x;
if(c == ' ')
break;
}//read a
while(1)
{
scanf("%d%c", &x, &c);
b[lb++] = x;
if(c == '\n')
break;
}//read b
}
bool IsZero(int num[], int l)
{
int i;
bool flag = true;
for(i=0; i<l; i++)
{
if(num[i] != 0)
flag = false;
}
return flag;
}
void Reverse(int num[], int l)
{
int i=0, j=l-1, t;
for(; i<j; i++, j--)
{
t = num[i];
num[i] = num[j];
num[j] = t;
}
}
void Add()
{
int maxlen = la > lb? la:lb;
int i;
for(i=0; i<maxlen; i++)
{
if(a[i]+b[i] >= prime[i])
{
a[i] = a[i]+b[i] - prime[i];
a[i+1]++;
}
else
{
a[i] += b[i];
}
}
for(i=26; i>= 0; i--) //两个25位相加,顶多26
{
if(a[i] != 0)
break;
}//找到第一个不为0的位
for(; i>=0; i--)
{
printf("%d", a[i]);
if(i>0)
printf(",");
else
printf("\n");
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r" , stdin);
#endif
while(1)
{
InitPrime();
InPut();
if(IsZero(a, la) || IsZero(b, lb)) break;
Reverse(a, la);
Reverse(b, lb);
Add();
}
return 0;
}