字符串转成整数大数乘法

本文介绍了如何实现将两个用字符串表示的大数进行相乘的方法。题目要求处理可能非常大的非负整数,并返回它们乘积的字符串形式。目前代码的输入部分尚未完善,计划后续修改以从控制台读取字符串。

今天看到的题如下所示:

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

Subscribe to see which companies asked this question


是大数乘法的实现,大数由字符串给出,读取字符串部分还没来得及实现:

#include<stdio.h>
#include<string.h>

void str_multi(int m, char* str1, int n, char * str2){
	int result[m+n], tmp[n][m+1], a[m], b[n], i, j, count, c;
	i = 0;
	while(i < m){                                           //把字符串转换成整数存放到数组中
		a[i] = str1[m-i-1] - '0';
		i++;
	}
	i = 0;
	while(i < n){
		b[i] = str2[n-i-1] - '0';
		i++;
	}
	i = 0;
	while(i < n){                                           //把计算结果放到二维数组中考虑到进位数组的每一行比被乘数长度+1
		c = 0;                                          // 用于保存每次乘法的进位
		for(j = 0; j < m; j++ ){
			tmp[i][j] = b[i] * a[j] % 10 + c;
			c = b[i] * a[j] / 10;
		}
		tmp[i][j] = c;
		i++;
	}
	count = c = 0;
	while(count < m+n){                                     //把二维数组中的数按对应的位相加得到每一位的数 
		if(count <= m){
			i = 0; j = count;
		}else{                                          //位数超出被乘数长度时
			i = count -m;
			j = m;
		}
		result[count] = c;
		while(i < n && j >= 0){
			result[count] += tmp[i++][j--];         //计算时一定要个位十位百位相对应的加
		}
		c = result[count]/10;                           //考虑相加后的进位
		result[count] = result[count]%10;
		count++;
	}
	for(i = 0; i < m+n; i++){
		printf("%d", result[m+n-i-1]);
	}
}



int main(void){
	//char str1[20], str2[20];

	int m, n, i;
	char ch;
	i = 0;
	/*while(getchar() != '\n');
	while((ch = getchar()) <= '9' && ch >= '0' && i < 20) str1[i++] = ch;
	while(getchar() != '\n');
	while((ch = getchar()) <= '9' && ch >= '0' && i < 20) str2[i++] = ch;*/
	char *str1 = "123455";
	char *str2 = "2222";
	m = strlen(str1);
	n = strlen(str2);
	str_multi(m, str1, n, str2);
	return 0;
}

代码main()函数中读取字符串部分还有点问题,这部分不是很熟练,时间关系明天再来修改。

修改后可以从控制台输入字符串 修改部分代码如下:

int main(void){
	char str1[50], str2[50];

	int m, n, i;
	char ch;
	i = 0;
	while((ch = getchar()) <= '9' && ch >= '0') str1[i++] = ch;          //读取第一个字符串
	str1[i] = '\0';
	m = i;
	i = 0;
	while((ch = getchar()) <= '9' && ch >= '0') str2[i++] = ch;         //读取第二个字符串
	str2[i] = '\0';
	n = i;
	str_multi(m, str1, n, str2);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值