for(int i = 0;i < LA;i++)
for(int j = 0;j < LB;j++)
c[i+j] += a1[i]*b1[j];
for(int i = 0;i < LA+LB;i++)//进行处理 把多位数变成单个字,大于10进 1
if(c[i] >= 10)
{
c[i+1] += c[i]/10;
c[i] %= 10;
}
因为得到的C数组是倒着的,不知道从哪个位置开始倒着打印出来
我们需要了解下面的小知识:
一个数(A位数)与另一个数(B位数)相乘
将两个乘数的最高位相乘,如果积是两位数,则这两个数的积为A+B位数,
将两个乘数的最高位相乘,如果积为个位数,则这两个数的积为A+B-1位数
上面可以用 while(!c[i] && i) i–; 代替
下面是代码测试:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[20] = {'1', '2' ,'3'};
char b[20] = {'1', '1', '1'};
//上面到时候可以换成接收两个字符串
int LA = strlen(a); //数组长度
int LB = strlen(b);
printf("LA:%d LB:%d\n", LA, LB);
int a1[20] = {0};
int b1[20] = {0};
int c[40] = {0};
//把字符串数组转换成整形数组
for (int i = 0; i < LA; i++) a1[i] = a[LA-1-i]-'0';
printf("a1: %d %d %d\n", a1[0], a1[1], a1[2]);
for (int i = 0; i < LB; i++) b1[i] = b[LB-1-i]-'0';
printf("b1: %d %d %d\n", b1[0], b1[1], b1[2]);
for(int i = 0;i < LA;i++)
for(int j = 0;j < LB;j++)
c[i+j] += a1[i]*b1[j];
for(int i = 0;i < LA+LB;i++)//进行处理 把多位数变成单个字,大于10进 1。
if(c[i] >= 10)
{
c[i+1] += c[i]/10;
c[i] %= 10;
}
//一个数(A位数)与另一个数(B位数)相乘
//将两个乘数的最高位相乘,如果积是两位数,则这两个数的积为A+B位数,
//将两个乘数的最高位相乘,如果积为个位数,则这两个数的积为A+B-1位数
int fa = a1[LA-1];//fa与fb分别为乘数的最高位
int fb = b1[LB-1];
printf("fa:%d fb:%d\n", fa, fb);
int t = 0; //t为要保留的位数
if(fa*fb >= 10)
t = LA + LB;
else
t = LA + LB-1;
for(int i = t-1; i >=0 ; i--)//倒着输出
printf("%d", c[i]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
char a[10000000], b[10000000];
int a1[10000000], b1[10000000];
int c[10000000];
int main()
{
scanf("%s%s", a, b);
int alen = strlen(a), blen = strlen(b);
for(int i = 0; i < alen; i++) a1[i] = a[alen-1-i] - '0';
for(int i = 0; i < blen; i++) b1[i] = b[blen-1-i] - '0';
for(int i = 0; i < alen; i++)
for(int j = 0; j < blen; j++)
c[i+j] += a1[i]*b1[j];
int i = 0;
for(i = 0; i < alen + blen; i++)
if(c[i] >= 10)
{
c[i+1] += c[i]/10;
c[i] = c[i]%10;
}
while(!c[i] && i) i--;
for(; i>=0; i--)
printf("%d", c[i]);
return 0;
}