废话不说,开讲!
所谓高精度算法,其实就是单精度算法的升级版。
那什么是单精度呢?单精度就是运算结果没有高精度大的运算,比如说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; //结束代码
}
制作不易,给个赞吧!!!