传送门
题意
求解在火星进制下下的A+B,火星进制下,每一位的权值与素数有关
题解
1.先求解先25位素数(利用欧拉筛选即可)
2.从每一行中提取A,B
用gets()读取一行,空格区间A,B,','隔开每一位数字存到数组中
并反转,使得每一位对齐
3.模拟两个数相加的过程即可
源代码
#include<cstdio>
const int maxn = 2e2;
bool v[maxn];
int a[maxn/2],inx = 0;
char c[100];
int numa[31],numb[31];
typedef long long ll;
void init(){
for(int i=2;i<maxn;++i){
if(!v[i])a[inx++]=i;
for(int j=0;a[j]*i<maxn;++j){
v[a[j]*i]=v;
if(i%a[j]==0)break;
}
}
}//筛选素数
void Swap(int &i,int &j){
int t = i;
i = j;
j = t;
}
void verse(int b[],int n){
int j = n/2;
for(int i=0;i<=j;++i)Swap(b[i],b[n-i]);
}//反转数组
int f(int i,int b[]){
int j=0;
for(;c[i]!=' '&&c[i];i++){
if(c[i]==',')j++;
else b[j]=b[j]*10+c[i]-'0';
}
verse(b,j);
return i;
}//提取数字A,B
int main(){
init();
while(gets(c)){
int i =0,bit=0,j=30;
for(int i=0;i<j;++i)numa[i]=numb[i]=0;
i = f(i,numa)+1;
f(i,numb);
for(int i=0;i<j;++i){
numa[i]+=numb[i]+bit;
if(numa[i]>=a[i])numa[i]-=a[i],bit=1;
else bit=0;
}//模拟两个数相加过程
while(j>=0&&!numa[j])j--;//处理前导0
if(j==-1)return 0;
for(;j>0;--j)printf("%d,",numa[j]);
printf("%d\n",numa[0]);
}
}