前言
今天我要讲的就是高精度加法,高精度加法,顾名思义就是大数+大数,让我们一起看看吧!
一、为什么要用高精度?
在c++中每个变量都有自己的类型,而每个类型能存储的长度也是有限的。
下面一张表是我自己整理出来的:
类型 | 字节 | 数值长 | short int (短整形) | 2 | -2的15次方到2的15次方-1 | int (整形) | 4 | -2的31次方到2的31次方-1 | long long(长整形) | 8 | -2的63次方到2的63次方-1 | float(短实数) | 4 | e-45是乘以10的负45次方?,e+38是乘以10的38次方 2的-149次方 ~ 2的128次方-1 | double | 8 | 4.9000000e-324 ~ 1.797693e+308? 2的-1074次方 , 2的1024次方- |
可以看出,每个类型都有自己的长度限制,超过限制,电脑就不能运算了。所以高精度就诞生了。
1.高精度的原理
高精度的原理其实就是我们加法竖式的原理。
比如说:213+498,那么竖式是这样的:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 213
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +? 498? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?711
这个竖式的原理我就不多介绍了。
那么我们咋么做高精度加法呢?
先看题:
题目描述
计算a+b的值,a,b皆为不超过240位的正整数。
输入
两个正整数,每行一个
输出
一个数,代表两个整数的和
样例输入复制
111111111111111111111111111111111111
222222222222222222222222222222222222
样例输出复制
333333333333333333333333333333333333
Very easy!分下面几个步骤: 1,因为输入的数大于longlong了,所以就用string先存着;
2,将string里存的数逆序存入数字数组,这样模拟手工从右往左计算过程。
3,循环(长的那个数组有多少个数,就循环多少次),两数相加,如果数>10,那就保留各位,十位加到下一个数中。
4,因为数逆序存入所以要逆序输出。
下面是正确代码👇:
1.0版
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],len_A,len_B,len_C,len_Ans;
void Read(int *A,int &Len)
{
string cur;
cin >> cur;
Len=cur.length();
for(int i=0;i<Len;i++)A[i]=cur[i]-48;
reverse(A,A+Len);
}
int main()
{
Read(A,len_A);
Read(B,len_B);
len_Ans=max(len_A,len_B);
for(int i=0;i<=len_Ans;i++)
{
Ans[i]=A[i]+B[i]+C[i];
if(Ans[i]>9)C[i+1]=Ans[i]/10,Ans[i]-=10;
}
while(Ans[len_Ans]>0)
{
len_Ans++;
}
for(int i=len_Ans-1;i>=0;i--)
cout<<Ans[i];
return 0;
}
但是发现太不好理解了,所以有2.0版
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[500];
int main()
{
cin>>s1>>s2;
for(int i=0;i<s1.size();i++)
{
a[s1.size()-i-1]=s1[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
b[s2.size()-i-1]=s2[i]-'0';
}
int len=s1.size();
if(s2.size()>len)
{
len=s2.size();
}
for(int i=0;i<len;i++)
{
c[i]=a[i]+b[i];
}
for(int i=0;i<len;i++)
{
if(c[i]>=10) c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
if(c[len]!=0) len++;
for(int i=len-1;i>=0;i--)
{
cout<<c[i];
}
cout<<endl;
return 0;
}
到这这题就结束了。
感谢观看!
|