<span style="font-size:18px;"><strong>
#include<stdio.h>
#include<algorithm>
char num1[111], num2[111];//输入的数
int num3[111];//保存结果的数
void reverse(char a[]){
int len = strlen(a);
int i;
int temp;
for(i = 0; i < len/2; i++){
temp = a[i];
a[i] = a[len-1-i];
a[len-1-i] = temp;
}
}
void multiply(char a[], char b[], int c[]){
int len1 = strlen(a);
int len2 = strlen(b);
int i, j;
int L;
reverse(a);
reverse(b);
for(i = 0; i < len1; i++){
for(j = 0; j < len2; j++){
c[i+j] += (a[i] - '0') * (b[j] - '0');
}
}//让两个数的每一位之间都相乘,还要累加, 所以c必须为数组,不可以为字符串
for(i = 0; i < len1 + len2 - 1; i++){
c[i+1] += c[i]/10;//进位
c[i] = c[i] % 10;
}
for(i = len1 + len2 - 2; i >= 0; i--){
printf("%d",c[i]);//因为之前两数相乘是倒置,所以这里倒着输出
}
}
using namespace std;
int main(){
scanf("%s%s",num1,num2);
memset(num3,0,sizeof(num3));
multiply(num1, num2, num3);
printf("\n");
return 0;
}</strong></span>
以上就是大数的乘法。
至于大数乘法连续乘,我参照了连续加的思路,进行了一下修改。
<span style="font-size:18px;">#include<stdio.h>
#include<algorithm>
char num1[111], num2[111];
int num3[111];
int len1, len2;
void reverse(char a[]){
int len = strlen(a);
int i;
int temp;
for(i = 0; i < len/2; i++){
temp = a[i];
a[i] = a[len-1-i];
a[len-1-i] = temp;
}
}
void multiply(char a[], char b[], int c[]){
len1 = strlen(a);
len2 = strlen(b);
int i, j;
reverse(a);
reverse(b);
for(i = 0; i < len1; i++){
for(j = 0; j < len2; j++){
c[i+j] += (a[i] - '0') * (b[j] - '0');
}
}
for(i = 0; i < len1 + len2 - 1; i++){
c[i+1] += c[i]/10;
c[i] = c[i] % 10;
}
while(c[i] == 0)
i--;
j = 0;
for( ; i >= 0; i--){
b[j++] = c[i] + '0';//数组c就保存了积,现在把这个积再赋值给字符串b,用于下一次相乘时作为 //因数出现,但是要注意,c是从低位排到高位,应该逆序赋值给字符串b
}
}
using namespace std;
int main(){
int i;
num2[0] = '1';
while(scanf("%s",num1) && strcmp(num1,"0")){
memset(num3,0,sizeof(num3));
multiply(num1, num2, num3);
}
i = len1 + len2 - 1;
while(num3[i] == 0)
i--;//去掉多余的0
for( ; i >= 0; i--){
printf("%d",num3[i]);
}
printf("\n");
return 0;
}</span>