大数系列——大数乘法

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值