算法精度专题:高精度运算之高精度加法运算

文章介绍了高精度算法的原理,通过对比单精度运算,阐述了当需要处理超过计算机常规数据类型所能表示的大数时,如何利用数组和竖式计算的思想来实现大数的加法。通过将输入转化为字符串,然后倒序转换为数组进行运算,解决了长整数运算的问题。代码示例展示了具体的实现过程。
摘要由CSDN通过智能技术生成

废话不说,开讲!

所谓高精度算法,其实就是单精度算法的升级版。

那什么是单精度呢?单精度就是运算结果没有高精度大的运算,比如说a + b的单精度写法如下:

#include<iostream>
using namespace std;

int main()
{
    int a,b;
    cin >> a >> b;
    cout << a + b;
    return 0;
}

很简单对吧!别着急,先复习一下变量类型:

char类型:1位字符

int类型:9位数字

……

最大:long long类型:19位

是不是看似已经很大了,但是有一道题是这么说的:

 别看它说的是不超过200位,其实意思就是说可能有199位数字和199位数字相加。

这个时候,long long类型也傻眼了。

然而,高精度运算即可快速解决这个问题。

首先我们复习一下小学1、2年级的竖式,354 + 28是这么写:

        354

+        28

————

        382

4 + 8满10进一,5 + 2再 + 1等于8,百位3 + 0=3,结果是382。

但其实原理并不是这样,而是4 + 8 > 10,让4 + 8的和与10取余,得到的数是个位,再拿4 + 8的和除以10,得到进位。

发现了吗?

高精度的思想其实就是把计算机心算(直接写出得数)加减改成计算机笔算(竖式)加减。

但还是无法保存那么大的数字啊!

所以数组登场了!!!

我直接把输入变量改成输入数组的每一位不就行了?

但是数组不能直接输入,所以字符串登场!!!(说不定一会儿就被替换掉了)

我先输入字符串,再将字符串转化成数组就行了。(果然被替换了)

但这里要注意的是,转化期间必须得要倒序转化(例如123转化成321)因为竖式计算是从右往左,而计算机做不到,所以只能倒序转化最后再倒序输出。

废话不多说,直接上代码!!!

#include<bits/stdc++.h>        //头文件
using namespace std;

int a[300],b[300],c[500],n,m;    //a为第一个加数,b为第二个加数,c为结果,n为a的长度,m为b的长度
char s[300];    //数组不能直接输入,要用字符串
int x = 0;    //x为进位

int main()
{
	scanf ("%s",s);    //输入第一个数,也可写作cin >> s;
	n = strlen(s);    //获取长度
	
	for (int i = 0;i < n;i++)
	{
		a[n - i] = s[i] - '0';    //倒序转化到a数组,至于为什么转化是这样转化就需要读者自己思考了
	}
	scanf ("%s",s);    //输入第二个数
	m = strlen(s);    //获取长度
	for (int i = 0;i < m;i++)
	{
		b[m - i] = s[i] - '0';    //倒序转化成数组b,方法与数组a一致
	}
	if (n < m) n = m;      //n取较大的长度
	for (int i = 1;i <= n;i++)
	{
		x = a[i] + b[i] + x;    //相同数位相加不管有没有进位都加x,因为没有进位x为0,有x为1
		c[i] = x % 10;    //余数即为和的当前位置的数
		x /= 10;    //获得进位
	}
	if (x > 0)    //处理最高位的进位
	{
		n++;
		c[n] = x;    //存储最高位
	}
	for (int i = n;i >= 1;i--) cout << c[i];    //因为前面倒序计算了,现在倒序输出
	return 0;    //结束代码
}

 制作不易,给个赞吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值