【算法章】高精度减法(精讲)

1.为什么需要高精度:

        我们常用的“int”类型通常占用 4 个字节(即 32 位),其数据范围为:-2147483648 到2147483647。而“long long”的范围是 -9223372036854775808 到 9223372036854775807。也就是说,当数据过长时,我们便需要用到高精度算法解决问题。相信前来学习高精度的同学也都遇到了相应问题,这里不再赘述了。

2.高精度加法的基本逻辑:

  1.  对于过长的数据,我们采用数组的形式来处理。
  2. 我们建立数组m承接被减数的值数组n承接减数的值(“2-1”中“2”为被减数,“1”为减数)
  3. 比较m和n的大小,将大数赋值给另一个数组a,小数赋值给数组b,若m给了a即为正数,n给了a为负数,输出负号。
  4. 删除前导0。
  5. 求出a和b的差,输出即可(是不是有些抽象呢?话不多说,上代码)。

3.高精度减法逐步剖析讲解:

   (1)我们引入两组数字

char m[500],n[500];
scanf("%s",&m);
scanf("%s",&n);

用char的原因:

        (1)我们在后面要使用strlen函数去获取字符串长度(不理解欢迎评论区提问)。

        (2)方便输入。

   (2)比较m和n的大小,大的逆序赋值给a,小的逆序赋值给b

lm=strlen(m);//lm是第一个数字的长度
ln=strlen(n);//ln是第二个数字的长度
if(lm>ln||(lm==ln&&strcmp(m,n)>0))//m的数字大
{
	for(i=0;i

(3)计算并处理退位

for(i=0;i

(4)删除前导0

while(c[lmax-1]==0&&lmax>1)//细品,这里逆序结构是不是杀疯了?
	{
		lmax--;
	}

(5)逆序输出结果

	for(i=lmax-1;i>=0;i--)//逆序输出
	{
		printf("%d",c[i]);
	}

 为什么逆序输出不必我说了吧,本来数组里的数就是反着的,输出时候肯定也要反过来啊。

4.完整代码

#include
#include
main()
{
	char m[500],n[500];
	int a[500]={0},b[500]={0},c[501]={0};
	int lm,ln,lmax,i;
	scanf("%s",m);
	scanf("%s",n);
	lm=strlen(m);//lm是第一个数字的长度
	ln=strlen(n);//ln是第二个数字的长度
	if(lm>ln||(lm==ln&&strcmp(m,n)>0))//m的数字大
	{
		for(i=0;i1)
	{
		lmax--;
	}
	for(i=lmax-1;i>=0;i--)//逆序输出
	{
		printf("%d",c[i]);
	}
}

——(如有问题,欢迎评论区提问)——

你可能感兴趣的:(算法,c语言,开发语言,算法)