高精度减法(c++)

高精度减法

每当要进行精度较高的运算时,就要用到高精度。
下图是各个类型的数值范围:
在这里插入图片描述
在这里插入图片描述
如果想不起各个类型占多少字节,可以采用下面的方法:

printf("%d %d",sizeof(int),sizeof(long long));

格式为:
sizeof(数据类型)

可以把值赋值给一个变量,也可以直接输出;
好了,回到正点。我们先看例题:

大整数减法

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 9471 通过数: 5448
【题目描述】
求两个大的正整数相减的差。

【输入】
共2行,第1行是被减数a,第2行是减数b(a>=b)。每个大整数不超过200位,不会有多余的前导零。

【输出】
一行,即所求的差。

【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000

读完题目,是不是发现这就是赤裸裸的模板题目;大概的思路为3步:
一,读入a和b;
二,进行计算,如果a[i]<b[i],就借位;
三,输出;

先是读数:

int i;
	int a[205],b[205],lena,lenb;
	char t[205],t1[205];
	scanf("%s %s",t,t1);
	lena=strlen(t);
	lenb=strlen(t1);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(i=0;i<lena;i++)a[lena-i]=t[i]-48;
	for(i=0;i<lenb;i++)b[lenb-i]=t1[i]-48;

再进行计算:

i=1;x=0;
	while((i<=lena) or (i<=lenb)){
		a[i]=a[i]-b[i]-x;
		if(a[i]<0){
			a[i]+=10;
			x=1;
		}
		 else x=0;
		i++;
	}

最后再输出:

bool f=false;
	for(i=N-1;i>=1;--i){
		if(a[i]!=0){
			printf("%d",a[i]);
			if(!f)f=true;
		}
		 else if(f)printf("%d",a[i]);
	}
	if(!f)printf("0");

完整AC程序:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int N=205;
int main(){
	int i;
	int a[N],b[N],lena,lenb,x;
	char t[N],t1[N];
	scanf("%s %s",t,t1);
	lena=strlen(t);
	lenb=strlen(t1);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(i=0;i<lena;i++)a[lena-i]=t[i]-48;
	for(i=0;i<lenb;i++)b[lenb-i]=t1[i]-48;
	i=1;x=0;
	while((i<=lena) or (i<=lenb)){
		a[i]=a[i]-b[i]-x;
		if(a[i]<0){
			a[i]+=10;
			x=1;
		}
		 else x=0;
		i++;
	}
	bool f=false;
	for(i=N-1;i>=1;--i){
		if(a[i]!=0){
			printf("%d",a[i]);
			if(!f)f=true;
		}
		 else if(f)printf("%d",a[i]);
	}
	if(!f)printf("0");
	return 0;
}

记得点赞哦

原文地址:https://www.cnblogs.com/luojunhang/p/12300187.html