高精度算法(2)

前言

延续上次所讲的内容再对乘法和除法进行说明,希望有所帮助

注意这里的乘除法都是针对于整数如果要是涉及到小数,我们得使用二分法

通过二分同样可以解决小数精度问题

高精度乘法

思路

我们只能用字符串来读取一个很大很大的数,所以说仍然是需要将字符转化为数字的

最后输出的是这个数的每一位

乘法的计算当然还是要依据与乘法法则

一位一位的相乘,注意不要先去遇10进1把它当成整体,把他们加在一起后再遇10进1

OK可以画个图来促进理解

看代码吧

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//高精度乘法
char s1[2005],s2[2005];
int a[2005], b[2005],c[2005];
int main()
{
	int la, lb, lc;
	printf("清输入两个数\n");
	scanf("%s", s1);
	scanf("%s", s2);
	la = strlen(s1);
	lb = strlen(s2);
	lc = la + lb;
	//逆置方便计算
	for (int i = 0; i < la; i++)
	{
		a[la - i] = s1[i]-'0';
	}
	for (int i = 0; i < lb; i++)
	{
		b[lb - i] = s2[i]-'0';
	}
	//开始相乘相加
	for (int i = 1; i <=la; i++)
	{
		for (int j = 1; j <=lb; j++)
		{
			c[i + j - 1] += a[i] * b[j];
			c[i + j] += c[i + j - 1] / 10;
			c[i + j - 1] %= 10;
		}
	}
	//清除前置0
	while (c[lc] == 0 && lc > 1)lc--;
	for (int i = lc; i > 0; i--)
	{
		printf("%d", c[i]);
	}
	return 0                                ;
}

再测试一下 

注意这里还是不能用while循环连续测试,是因为代码中存在全局变量在使用的过程中可能不会消除上一次的影响

高精度除法

 这个高精度除法仍然是针对于整数的,我们是使用逐位试商法

看看我画图

这里同时也要清除前置0,而且除数也不能为0

看代码吧

char s1[5005]; long long b,c[5005],x,a[5005],la,lc;
int main()
{
	printf("请输入被除数与除数");
	cin >> s1 >> b;
	la = strlen(s1);
	//对于除法是不需要逆置的
	for (int i = 1; i <= la; i++)a[i] = s1[i - 1] - '0';
	for (int i = 1; i <= la; i++)
	{
		c[i] = (x * 10 + a[i]) / b;//x一开始等于0
		x = (x * 10 + a[i])%b;
	}
	//清除前置0
	lc = 1;
	while (c[lc] == 0 && lc < la)lc++;
	for (int i = lc; i <= la; i++)
	printf("%d", c[i]);
	return 0;
}

总结

对于最后,想要说的是,对于高精度的算法,我们重点是了解一下四则运算的基本算法

其实这本身的思路更加重要

好了,希望有所收获

                                                                                                                                               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值