HDU1230 火星A+B




//HDU1230 火星A+B
#include<stdio.h>  //使用输入输出函数
#include<string.h>  //使用字符串函数
int prim[50];  //存储素数列表
int p[250];  //用于筛选素数处理
void makeprime()  //筛选法求素数
{
    int i,j;
    memset(p,0,sizeof(p));  //初始化数组
    for(i=2;i<125;i++)   //筛选法求素数
        for(j=i+i;j<250;j+=i)
            p[j]=1;
    for(i=2,j=0;i<250&&j<50;i++)  //形成素数列表
        if(!p[i])
            prim[j++]=i;
}
int main()
{
    char x[1000],y[1000],*p;  //输入数组,存储原始数据、指针
    int a[50],b[50],t; //处理数组,中间变量
    int len,lena,lenb;//记录长度
    int i,j;  //循环变量

    makeprime();//产生素数数组

    while(scanf("%s%s",x,y)&&x[0]!='0'||y[0]!='0')  //初始化
    {
        //初始化处理数组
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        //处理第一个“火星数”
        lena=0;
        p=x;
        while(strstr(p,","))//提取数字
        {
            sscanf(p,"%d",&a[lena++]);
            p=strstr(p,",")+1;
        }
        sscanf(p,"%d",&a[lena]);
        for(j=0;j<=lena/2;j++)//数字逆序处理[低位放前面,高位放后面,利于进位处理]
        {
            t=a[j];
            a[j]=a[lena-j];
            a[lena-j]=t;
        }
        //同上
        lenb=0;
        p=y;
        while(strstr(p,","))
        {
            sscanf(p,"%d",&b[lenb++]);
            p=strstr(p,",")+1;
        }
        sscanf(p,"%d",&b[lenb]);
        for(j=0;j<=lenb/2;j++)
        {
            t=b[j];
            b[j]=b[lenb-j];
            b[lenb-j]=t;
        }
        //检测输出
        /*printf("---------a---------\n");
        for(i=0;i<=lena;i++)printf("%d ",a[i]);
        printf("\n\n");
        printf("---------b---------\n");
        for(i=0;i<=lenb;i++)printf("%d ",b[i]);
        printf("\n\n");*/
        //加法处理,进位处理
        len=lena>lenb?lena:lenb;//提取最大长度
        for(i=0;i<=len;i++)
        {
            a[i]+=b[i];  //加法处理
            if(a[i]>=prim[i])  //进位处理
                a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i];
        }
        if(a[i]>=prim[i])  //假设最高位需要进位
            a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i];

        if(a[i])len++; //若最高位进位,总体长度加一
        //输出答案【中间用逗号隔开,最后要换行】
        //printf("ans=");
        printf("%d",a[len]);
        for(i=len-1;i>=0;i--)printf(",%d",a[i]);
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值