乘法如何突破位数限制

        如果我们用int或double等进行乘法运算是有位数和精确度的限制,如何突破这种限制呢?当然只能自己写一个乘法运算。

        如果我们用笔和纸进行乘法运算是没有位数和精确度限制的,那么我们是否可以模拟用笔和纸做乘法运算呢?在一定范围内是可以。首先我们可以肯定,一位数乘一位数是可以实现的,然后我们可以设置两个char数组a[n]和b[n]来个记录两个n位数,无论是小数还是整数,然后设置一个int数组c[2n]来记录结果。注意:n位数乘m位数的结果必定是在n+m位数之内。计算过程就是,a[n]和b[n]中,每两个数的相乘,将结果放在c[2n]中的相应位置,最后进行满10进1的计算得到结果。下面是代码:

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


int main(void)
{
	char a[1024] = { 0 };
	char b[1024] = { 0 };
	int c[2048] = { 0 };
	int an, bn;
	scanf("%s", a);
	scanf("%s", b);
	an = strlen(a);
	bn = strlen(b);
	// 舍去末尾的 0
	for (int i = an - 1; i >= 0; i--) {
		if (a[i] != '0')
			break;
		else {
			a[i] = '\0';
			an--;
		}
	}
	for (int i = bn - 1; i >= 0; i--) {
		if (b[i] != '0')
			break;
		else {
			b[i] = '\0';
			bn--;
		}
	}
	// 计算小数点的位数及舍去小数点
	int ap = 0, bp = 0;
	if (strchr(a, '.')) {
		for (char *temp = strchr(a, '.'); *temp != '\0'; temp++) {
			*temp = *(temp + 1);
			ap++;
		}
		ap--;
		an--;
	}
	if (strchr(b, '.')) {
		for (char *temp = strchr(b, '.'); *temp != '\0'; temp++) {
			*temp = *(temp + 1);
			bp++;
		}
		bp--;
		bn--;
	}
	int cp = ap + bp;
	// 乘法计算
	for (int i = 0; i < bn; i++) {
		for (int j = 0; j < an; j++) {
			int ai = an - j - 1;
			int bi = bn - i - 1;
			int cn = (a[j] - '0') * (b[i] - '0');
			int ci = ai + bi;
			div_t d = div(cn, 10);
			c[ci] += d.rem;
			c[ci + 1] += d.quot;
		}
	}
	// 满10进1
	for (int i = 0; i < an + bn; i++) {
		div_t d = div(c[i], 10);
		c[i] = d.rem;
		c[i + 1] += d.quot;
	}
        // 输出及插入小数点
	int start = 0;
	for (int i = an + bn - 1; i >= 0; i--) {
		if (c[i] != 0 || i == cp)    // 舍去最高位的0,至少保留小数点前一位
			start = 1;
		if (start) {
			if (i + 1 == cp) {
				printf(".");
			}
			printf("%d", c[i]);
		}
		
	}

	//system("pause");
	return 0;
}

测试:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值