<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>