高精度乘法【模板】

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

输入两个非负整数A和B,求A*B

输入描述:

输入有一行,分别为两个整数A和B。

0≤A,B≤1010000 \le A,B \le 10^{1000}0≤A,B≤101000

输出描述:

输出一行,表示A*B

输入:

2 4

输出:

8

答案:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char a1[10001],b1[10001];//字符数组可以按位存储
int a[10001],b[10001],i,x,len,j,c[10001];
int main ()
{
    cin>>a1>>b1;
    int lena=strlen(a1);
	int lenb=strlen(b1);
    for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';//将数组倒置并强制转换为整数数组;
    for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
	for(i=1;i<=lenb;i++)//利用循环按位相乘
	for(j=1;j<=lena;j++)
	c[i+j-1]+=a[j]*b[i];
    for(i=1;i<lena+lenb;i++)//将数组中两位数转换为一位数。
	if(c[i]>9)
	{
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	len=lena+lenb;
    while(c[len]==0&&len>1)len--;//遍历整个数组将前导0去除。
    for(i=len;i>=1;i--)cout<<c[i];//将数组倒置输出
    return 0;
}

解释:

ai:

  1. 数组索引从1开始
    C++(和大多数编程语言)的数组索引默认从0开始。虽然从技术上讲,你可以从1开始索引数组,但这通常不是最佳实践,因为它可能导致访问数组时越界(特别是当数组长度为0时)。此外,它使得与标准库函数(如strlen)的交互变得复杂,因为strlen返回的是最后一个字符的索引加1(即字符串长度),但数组索引从0开始。

  2. 结果数组长度计算
    结果数组c的长度可能超过两个输入数组长度之和,特别是在大数乘法中。因此,应该为c分配足够的空间以存储可能的最大结果。

  3. 数组初始化
    在C++中,未初始化的局部变量(如c数组)可能包含任意值。为了安全起见,最好在使用前将数组初始化为0。

 

 

 

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值