链接:登录—专业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开始:
C++(和大多数编程语言)的数组索引默认从0开始。虽然从技术上讲,你可以从1开始索引数组,但这通常不是最佳实践,因为它可能导致访问数组时越界(特别是当数组长度为0时)。此外,它使得与标准库函数(如strlen
)的交互变得复杂,因为strlen
返回的是最后一个字符的索引加1(即字符串长度),但数组索引从0开始。 -
结果数组长度计算:
结果数组c
的长度可能超过两个输入数组长度之和,特别是在大数乘法中。因此,应该为c
分配足够的空间以存储可能的最大结果。 -
数组初始化:
在C++中,未初始化的局部变量(如c
数组)可能包含任意值。为了安全起见,最好在使用前将数组初始化为0。