大数乘法

大数乘法

Sample Input
111111111111
222222222222


Sample Output
24691358024641975308642

1

#include<stdio.h>
#include<string.h>
int main()
{
    int f;
    int i,j,an,bn,k,d;
    char a[1000],b[1000];
    int af[1000]= {0},bf[1000]= {0},c[1000]= {0};
    while(scanf("%s%s",a,b)!=EOF)
    {
        an=strlen(a);
        bn=strlen(b);
        k=an>bn?an:bn;
        c[0]=0;
        f=0;
        for(i=0; i<an; i++)
            af[i]=a[an-i-1]-'0';
        for(i=0; i<bn; i++)
            bf[i]=b[bn-i-1]-'0';

        for(j=0; j<bn; j++)
        {
            for(i=0; i<an; i++)
            {
                d=c[i+j];
                c[i+j]=(d+bf[j]*af[i])%10;
                c[i+1+j]+=(d+bf[j]*af[i])/10;
            }
        }
        for(i=an+bn; i>=0; i--)
        {
            if(c[i])
                f=1;
            if(f || i==0)
                printf("%d",c[i]);
        }
        printf("\n");
        for(i=0; i<2*k; i++)
            c[i]=af[i]=bf[i]=0;
    }
}

2

#include <stdio.h>
#include <string.h>
#define MAX_LEN 200
unsigned an1[MAX_LEN+10];
unsigned an2[MAX_LEN+10];
unsigned aResult[MAX_LEN * 2 + 10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main()
{
    gets( szLine1); //gets函数读取一行
    gets( szLine2);
    int i, j;
    int nLen1 = strlen( szLine1);
    memset( an1, 0, sizeof(an1));
    memset( an2, 0, sizeof(an2));
    memset( aResult, 0, sizeof(aResult));
    j = 0;
    for( i = nLen1 - 1;i >= 0 ; i --)
        an1[j++] = szLine1[i] - '0';
    int nLen2 = strlen(szLine2);
    j = 0;
    for( i = nLen2 - 1;i >= 0 ; i --)
        an2[j++] = szLine2[i] - '0';
    //每一轮都用an2的一位,去和an1各位相乘,从an1的个位开始
    for( i = 0;i < nLen2; i ++ )    {
        //用选定的an2的那一位,去乘an1的各位
        for( j = 0; j < nLen1; j ++ )
            //两数第i, j位相乘,累加到结果的第i+j位
            aResult[i+j] += an2[i]*an1[j];
    }
    //下面的循环统一处理进位问题
    int nHighestPos = 0;
    for( i = 0; i < MAX_LEN * 2; i ++ ) {
        if( aResult[i] >= 10 ) {
            aResult[i+1] += aResult[i] / 10;
            aResult[i] %= 10;
        }
        if( aResult[i] )    nHighestPos = i;
    }
    for( i = nHighestPos; i >= 0; i -- )
        printf("%d", aResult[i]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值