关于大整数相乘

由于int范围有限,对于大整数相乘必定不能直接用*符号,而是用char型数组记录,通过模拟乘法达到大整数相乘的效果,

假定a数组长度为A,b数组长度为B。求出来的大整数长度有三种可能,

1.A+B(最后一位无进位),

2.A+B+1(最后一位有进位),

3.0(数a或者数b其一为0)(不要忽略这种可能,我就是忽略了这个一直WA....)

代码如下,

void bigmultiply_methods(char  *a, char *b, char *c) {    
	
	int A = strlen(a), B = strlen(b), add, mul, i, j,k;                          //mul记录乘法进位,k记录加法进位
	for (j = 0; j < B; j++) {
		mul = 0;
		k = 0;
		for (i = 0; i < A; i++) {
			if (mul&&k)   add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0') + mul+k;     //add为加上的数
			else if (!mul&&k)   add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0')+k ;
			else if (mul&&!k)  add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0') + mul;
			else add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0'); 
			if (add > 9) {
				mul = add  / 10;
			    c[j + i] += (add  % 10);
			}
			else {
				mul = 0;
				c[j + i] += add;
			}
			if (c[j + i]>'9') {
				k = (c[j + i] - '0') / 10;
				c[j + i] = (c[j + i] - '0') % 10+'0';
			}
			else k = 0;                                                          //如果c[j+i]<='9',记得k清零,表示无加法进位了。
		}
		if (mul)  c[j + i] += mul;                                //因为循环出来还有最后一位没有判断,故要再判断最后一位
	    if(k) c[j + i] += k;
	}
	if (c[j + i]!='0') c[j + i + 1] = '\0';
	else c[j + i] = '\0';
	//c数组要逆序输出
}
时间复杂度约为 O(AB).

希望大家有所收益,如果代码有问题或者有建议,我也希望一起交流进步呢。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值