高精度计算在平时并不是很常用,但是还是一个要掌握的知识点,高精度计算的题目难度不大,方法也比较简单,就是用一个数组来存储一个很长的数的每一位,然后在进行加、减、乘、除这四个基本运算,其实高精度计算的题目只记住四个模板就可以。
一.高精度加法
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
vector<int> a,b,c;
int main()
{
string n,m;
cin>>n>>m; //输入数据
if(m.length()>n.length()) swap(n,m);//如果m比n长,则交换n和m
int lm=m.length(),ln=n.length();
for(int i=ln-1;i>=0;i--) a.push_back(n[i]-'0'); //将在字符串中的数存
for(int i=lm-1;i>=0;i--) b.push_back(m[i]-'0'); //入整型数组中
int t=0; //并将最高位放到最后,方便计算
for(int i=0;i<ln;i++)
{
t+=a[i];
if(i<lm) t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(t); //看看最高位有没有进位
for(int i=c.size()-1;i>=0;i--) //输出答案
cout<<c[i];
return 0;
}
1
二.高精度减法
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
vector<int> a,b,c;
int main()
{
string n,m;
cin>>n>>m;
if(n.length()<m.length()||n.length()==m.length()&&m>n)
{ //比较n和m,如果m大于n则转化为m-n
swap(n,m);
cout<<"-";
}
int ln=n.length(),lm=m.length();
for(int i=ln-1;i>=0;i--) a.push_back(n[i]-'0');//将字符串转换为整型数组
for(int i=lm-1;i>=0;i--) b.push_back(m[i]-'0');
int t=0;
for(int i=0;i<ln;i++) //进行减法操作
{
t=a[i]-t;
if(i<lm) t-=b[i];
c.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(c.size()>1&&c.back()==0) c.pop_back(); //去除前导0
for(int i=c.size()-1;i>=0;i--) //输出答案
cout<<c[i];
return 0;
}
1
三.高精度乘法一一一高精度乘低精度
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
vector<int> a,c;
int main()
{
string n; //高精度整数用字符串n存
int m; //低精度整数用整形存即可
cin>>n>>m;
int ln=n.length();
for(int i=ln-1;i>=0;i--) a.push_back(n[i]-'0');
int t=0;
for(int i=0;i<ln;i++)
{
t+=a[i]*m; //t每次加上a的第i位与b的乘积
c.push_back(t%10);//将t的最后一位放入c中
t/=10;
}
while(t) c.push_back(t%10),t/=10;//将剩下的t中元素全部放入c中
for(int i=c.size()-1;i>=0;i--)
cout<<c[i];
return 0;
}
1
四.高精度除法一一一高精度除低精度
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
vector<int> a,c;
int main()
{
string n;
int m;
cin>>n>>m;
int ln=n.length();
for(int i=0;i<ln;i++) a.push_back(n[i]-'0');//高精度除法计算时
int t=0; //不需要交换位置
for(int i=0;i<ln;i++)
{
t=t*10+a[i];
c.push_back(t/m); //将t/m的值放入c中
t%=m; //t等于除完的后的余数
}
reverse(c.begin(),c.end()); //反转c数组,去除前导0
while(c.size()>1&&c.back()==0) c.pop_back();
for(int i=c.size()-1;i>=0;i--)//输出答案
cout<<c[i];
cout<<endl<<t; //输出除完后的余数
return 0;
}