分析:
10进制数38,在火星上记为“1,1,1,0”
, 表示有1个7,一个5,1个3,0个2的意思。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
bool prime(int n){
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main(){
string a,b;
int p[30];
int n=0;
for(int i=2;;i++){ //将前25个素数放入素数表
if(prime(i)){
p[n++]=i;
if(n>25)
break;
}
}
//p[25]: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
while(cin>>a>>b){
if(a=="0"&&b=="0")
break;
int k1=1,k2=1; //k为每个火星中有个几个整数
int l1=a.length(),l2=b.length();
int t1[30],t2[30]; //存放输入的整数
memset(t1,0,sizeof t1);
memset(t2,0,sizeof t2);
t1[0]=atoi(a.c_str()); //存放第一个整数
for(int i=0;i<l1;i++){
if(a[i]==','){ //遇到逗号存放下一个整数
string t=a.substr(i+1);
t1[k1++]=atoi(t.c_str());
}
}
t2[0]=atoi(b.c_str());
for(int i=0;i<l2;i++){
if(b[i]==','){
string t=b.substr(i+1);
t2[k2++]=atoi(t.c_str());
}
}
reverse(t1,t1+k1); //倒置方便计算
reverse(t2,t2+k2);
// for(int i=0;i<k1;i++){
// cout<<t1[i]<<" ";
// }
// cout<<endl;
// for(int i=0;i<k2;i++){
// cout<<t2[i]<<" ";
// }
// cout<<endl;
int l3=max(k1,k2);
int add=0,temp;
int ans[30],v;
for(v=0;v<l3;v++){ //大数加法的方法
temp=t1[v]+t2[v]+add;
ans[v]=temp%p[v]; //对每个位置的进制计算
add=temp/p[v];
}
// cout<<l3<<endl;
if(add){
ans[v++]=add;
}
for(int j=v-1;j>=0;j--){
if(j==v-1)
cout<<ans[j];
else
cout<<","<<ans[j];
}
cout<<endl;
}
return 0;
}