杭电 1230 火星a+b 【大数】【进制转换】

29 篇文章 0 订阅
6 篇文章 0 订阅
<pre name="code" class="objc">#include<stdio.h>//自己打的
#include<math.h>
#include<string.h>
int ss(int n)//学长加的打表= =
{
    int i;
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0)
            return 0;
    }
    return 1;
}
int main()
{
    int a[105],b[105],c[105],num1,num2,i,l1,l2;
    char str1[1000],str2[1000];
    //int f[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
    int f[1000];
    int z=0;
    for(i=2;i<1000;i++)
    {//学长加的打表= =
        if(ss(i)==1)
            f[z++]=i;
    }
    while(EOF!=scanf("%s%s",str1,str2)&&(strcmp(str1,"0")!=0&&strcmp(str2,"0")!=0))
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        num1=0;num2=0;
        l1=strlen(str1);l2=strlen(str2);

        for(i=0;i<l1;i++)
        {
            if(str1[i]>='0'&&str1[i]<='9')
            {
                a[num1]*=10;
                a[num1]+=str1[i]-'0';
            }
            else
                num1++;
        }

        for(i=num1;i>=0;i--)
            c[i]=a[num1-i];
        for(i=0;i<l2;i++)
        {
            if(str2[i]>='0'&&str2[i]<='9')    
            {
                b[num2]*=10;
                b[num2]+=str2[i]-'0';
            }
            else if(str2[i]==',')
                num2++;
        }
        for(i=num2;i>=0;i--)
                c[i]+=b[num2-i];
        num1=num1>num2?num1:num2;
        for(i=0;i<=num1;i++)
        {
            if(c[i]>=f[i])
            {
                c[i]=c[i]%f[i];
                c[i+1]+=1;
            }
        }
        if(c[num1+1]!=0)
            num1++;
        for(i=num1;i>=0;i--)
        {
            printf("%d",c[i]);
            if(i)  printf(",");
        }
        printf("\n");
    }
    return 0;
}


<pre name="code" class="objc"><pre name="code" class="objc">#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;  
}  


 


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值