大数乘法(高精度)

题目描述

求两数的积。

输入格式

两行,两个整数。

输出格式

一行一个整数表示乘积。

输入输出样例

输入

1
2

输出

2

说明/提示

每个数字不超过 10^2000,需用高精。

#include<bits/stdc++.h>
using namespace std;

#define ll long long

void Mul(char a[],char b[])
{
    int x[10005],y[10005],sum[10005];//分别用来存大数a,大数b,以及二者的成绩
    memset(x,0,sizeof(x));//初始化数组
    memset(y,0,sizeof(y));
    memset(sum,0,sizeof(sum));
    for(int i=0;i<strlen(a);i++)//把字符串a,倒过来转变成int型数组x(因为输入时高位在前,而计算时应从x[0]开始,且x[0]应该为最低位)
        x[strlen(a)-1-i] = a[i] - '0';
    for(int i=0;i<strlen(b);i++)//同理把字符串b,倒过来转变成int型数组y
        y[strlen(b)-1-i] = b[i] - '0';
    int c = strlen(a)+strlen(b);//二者的乘积长度不会超过二者之和
    for(int i=0;i<strlen(a);i++)
    {
        for(int j=0;j<strlen(b);j++)
        {
            sum[i+j] += x[i]*y[j];//分析出x[i]与y[j]的乘积应放于sum[i+j]处
            if(sum[i+j]>=10)//如果该位置(sum[i+j])的乘积大于等于10,就把它的十位给sum[i+j+1],个位给sum[i+j]
            {
                sum[i+j+1] += sum[i+j]/10;//任何一个位置的sum都不可能大于9
                sum[i+j] %=10;
            }
        }
    }
    
    while(sum[c]==0)//把成绩前面的0去掉,(防止出现123*32=03936类似情况)
    {
        if(c==0)break;//防止结果为0时,一直c--导致没有输出的情况(例如123*0无结果的情况)
        c--;
    }
        
    for(int i=c;i>=0;i--)//输出结果
        printf("%d",sum[i]);
    
}

int main()
{
	char a[10005],b[10005];
    scanf("%s%s",a,b);//输入两个大数
    Mul(a,b);

	system("pause");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值