高精度加(减)法

Dev.C++高精度加法:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。

先贴代码:


#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000],b[1000],c[1000],l1,l2,l;
char x[1000],y[1000]; 
int main(){
	gets(x);
	gets(y);
	l1=strlen(x);
	for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
	l2=strlen(y);
	for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;
	l=max(l1,l2);
	for(int i=1;i<=l;i++){
		n=a[i]+b[i]+m;
		m=c[i]/10;
		c[i]=n%10;
		m=m+n;
		if(m<10)m=0;	
		else{
			m=1;
			c[i+1]++;
		}
	}
	if(m)l++;
	for(int i=l;i>=1;i--)cout<<c[i];
}

意义:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。
使用:既然用整形装不下,那就用数组!因为字符数组输入时是一个字符一个字符的输入,所以用字符数组输入。
运算部分用整形数组还是字符数组都无所谓了,只不过字符数组要调整的地方可能比较多,
所以这里转换成整形数组-- -- -- -- -- -- -- -- -- -- -- -- --

for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;

-- -- -- -- --与此同时获取他们的数位-- -- -- -- -- -- -- -- -- -

l1=strlen(x);
l2=strlen(y);
l=max(l1,l2);

接下来是重点的计算部分(顺着代码讲,贴!)   

        for(int i=1;i<=l;i++){
		n=a[i]+b[i]+m;
		m=c[i]/10;
		c[i]=n%10;
		m=m+n;
		if(m<10)m=0;	
		else{
			m=1;
			c[i+1]++;
		}
	}
	if(m)l++;

  • n:暂时性储存并计算第i位
  • m:暂时清0
  • c[i]:将n的数值存入输出数组中
  • n%10{
    假设n<10
    此时n÷10=0,余数是它本身。把它赋进去就ok
    当n≥10时
    n÷10=1,余数是它本身减去10.
    所以把n%10赋进去就ok
    }
  • m:测试进位问题{
    当m<10时,这一位莫得进位,可以安心算下一位了
    当m≥10时,这一位有进位,要进行整理。首先,将下一位加一个一(这是因为当它是最后一位时,最后一位进位了,
    但是l不到那里,所以循环已经结束了,不会进行进位运算。平常的情况,c数组等于一时,后来回直接变成n而不是加等于,所以这一点不用担心),
    然后,将m+1(下一次运算中会将m算入进位计算中,还能起到标记作用)就ok了.
    }
  • if(m)l++:在m≠0时,他是要进位的。但是如果到了最后一位,因为l是固定的,所以要进行数组扩容,将进位的地方也输出出来
    倒序输出:我们是正序计算的(也可以倒序计算,那么输入输出就是正序的),因为计算是从小位算到大位,而输入输出是从大位开始的,
    所以两者顺序要反
    一下。
    —————————————————————————————————————————————————————————————————————

结论: 其实高精度加法挺简单的 减法和加法思路是一样的,只不过借位与进位处理有些不同罢了。高精度的计算可以当成一个模板打在函数里(在数据大的时候),

所以最好背下来哦!

原文地址:https://www.cnblogs.com/riced/p/13393466.html