hdu 1230 火星A+B

hdu 1230 火星A+B


传送门

题意

求解在火星进制下下的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]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值