高精度加法和减法

这应该算是我真正意义上的第一篇博客,前一段时间写的都是当天学到的知识和对应的题目练习。

首先,对于高精度而言,其实就是去计算大的数字,就是平时我们使用的int类型或者long long int类型计算不出来的大数字。

下面给大家配一张平时常见到的数据类型对应的数值范围:

高精度加法和减法_第1张图片

那么,我们首先开始高精度加法的学习:

(c++用户):

#include//万能头文件
using namespace std;
string x,y;
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int main()
{
	cin>>x>>y;//输入对应的俩个数字(每个数字占一行)
	la=x.length();
	lb=y.length();//求出对应的长度
	for(i=0;i0) lc++;
	for(i=lc;i>=1;i--)
	{
		cout<

(c用户):

#include
#include//在C语言里面就要使用string头文件
char x[100000],y[100000];
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int max(int a,int b)
{
	int c;
	return c=(a>b)?a:b;
}//在C语言里面没有直接的max让我们使用,那么咱们自己写一个
int main()
{
	scanf("%s",x);
	scanf("%s",y);
	la=strlen(x);
	lb=strlen(y);//计算长度
	for(i=0;i0) lc++;//前面那一个C++代码把关键点都说了,这里我就强调一下我遗漏的一点:
	for(i=lc;i>=1;i--)//就是这里的if判断,如果最后要输出的数组c的最后一位lc的下一位>0
	{
		printf("%d",c[i]);//那么说明咱们要输出的位数lc要加一了
	}
	return 0;
}

在这里我总结一下:关于高精度加法的步骤

1.读入字符串

我在C++里面使用的是cin,在C语言里面使用的是scanf;
2.字符串转数组

就是把字符串放在数组里面;
3.字符串转数字(-'0')

s[ls-i]=x[i]-'0';就是使用数组s来倒序存放输入的字符串,并且通过减去‘0’来转换为数字;
4.竖式加法

   c[i]+=a[i]+b[i];
   c[i+1]=c[i]/10;
   c[i]=c[i]%10;//模板

5.判断进位

if(c[lc+1]>0) lc++;
6.倒序输出

i=lc;i>=1;i--//一定要记住是i--

最后,我再强调一下:高精度加法还可以(lc=max(la,lb)+1)同时下面的if改为(c[lc]==0&&lc>0或者lc>1都可以)lc--;

接下来就是高精度减法了:

(C++用户)//注意定义a、b、c数组的时候要记住是int型(而不是char型)

#include
using namespace std;
string x,y;
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int main()
{
	cin>>x>>y;
	la=x.length();
	lb=y.length();
	if(la1) lc--;//消去前导零,但是最起码要保留一位(不妨自己试试看)
	for(i=lc;i>=1;i--)
	{
		cout<

(C用户)

#include
#include
char x[100000], y[100000];
int a[100000], b[100000], c[100000], la, lb, lc;
int i;
void swap1(char a[], char b[])//这里就是坑人的字符串转换
{                             
	char c[100000];           
	strcpy(c, a);             
	strcpy(a, b);             
	strcpy(b, c);             
}
void swap2(int* a, int* b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;//注意:只有传地址对应的参数才会在主函数里面改变,传值是不会变的
}
int main()
{
	scanf("%s", x);
	scanf("%s", y);
	la = strlen(x);
	lb = strlen(y);
	if (la < lb || (la == lb && x < y))
	{
		swap2(&la, &lb);
		swap1(x, y);
		printf("-");//如果数字a小于b的判断
	}
	for (i = 0; i < la; i++)
	{
		a[la - i] = x[i] - '0';
	}
	for (i = 0; i < lb; i++)
	{
		b[lb - i] = y[i] - '0';
	}
	lc = la;
	for (i = 1; i <= lc; i++)
	{
		if (a[i] < b[i])
		{
			a[i] = a[i] + 10;
			a[i + 1]--;
		}
		c[i] = a[i] - b[i];
	}
	while (c[lc] == 0 && lc > 1) lc--;//去前导零
	for (i = lc; i >= 1; i--)
	{
		printf("%d", c[i]);
	}
	return 0;
}//终于写完了

today is 2022_1_29;

        以上就是我对于高精度加法和减法的了解。如果你觉得我的文章对你有用请点个赞支持一下吧,喜欢我写的文章那么请点个关注吧,如果我的文章里面知识点很多那么就请收藏一下方便您以后使用。如果此文章有错误或者有不同的见解欢迎评论或者私信我。

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