高精度计算

高精度计算在平时并不是很常用,但是还是一个要掌握的知识点,高精度计算的题目难度不大,方法也比较简单,就是用一个数组来存储一个很长的数的每一位,然后在进行加、减、乘、除这四个基本运算,其实高精度计算的题目只记住四个模板就可以。

一.高精度加法
#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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lwz_159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值