高精度加减法

目录

高精度是什么?

说明/提示

 说明/提示

百度百科

代码

加法

负数!!!

减法

重大事件

代码来咯!


高精度是什么?

额……

不知道你们有没有遇上这种坑题

说明/提示

每个数字不超过 10^{2000}

明显,开__int128也不够,还可能会遇上残忍的TLE

好了,此题无解

真的吗???

 说明/提示

每个数字不超过 10^{2000}………………,需用高精度

那话说回来,高精度又是啥呢

百度百科

高精度算法High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。

代码

接下来看一下思路

首先呢我们选择用string做(网上都是数组,但string输入输出简单,开的也可以更大,还有很多辅助功能(可以多定义一些),我觉得更好一些)

再来看一看加法

加法

这个直接看竖式

    12345678

+  22345678

          1111  (进位)

————————

     34691356

进位也不难

但你在看下面的代码上时

会发现特别长

为什么

因为

负数!!!

男不男???

当然,复制下方代码准没错

减法

这边呢

有个退位

还有减数太大的问题

所以有一些特判

当然没啥大的问题

看竖式

     . . . . (退位位)

   12345

-    7777

——————

      4568

好了,你学fei了吗?

重大事件

  1. 调了一个下午,把int*调为string,然后……加减法好难(这不就相当于没做吗???)
  2. 到了晚上,终于调好了
  3. 又调了一个上午,增加了负数的加减法

代码来咯!

#include<bits/stdc++.h>
using namespace std;
namespace high_pre{
	typedef string high_pre_num;
	high_pre_num input(){//输入 
		high_pre_num a="";
		cin>>a;
		reverse(a.begin(),a.end());
		return a;
	}
	high_pre_num init(string x){//定义(等于a=……) 
		high_pre_num a="";
		reverse(x.begin(),x.end());
		a=x;
		return a;
	}
	void output(high_pre_num a){//输出 
		reverse(a.begin(),a.end());
		bool s=0,k=0;
		for(int i=0;i<a.size();i++){
			if(a[i]=='-')
			    k=1;
			else if(a[i]>'0'){
				if(k){
					putchar('-');
					k=0;
				}
			    s=1;
			}
			if(s)
			    putchar(a[i]);
		}
		if(!s){
		    putchar('0');
		}
	}
	bool greater(high_pre_num a,high_pre_num b){//大于 
		if(a[a.size()-1]!='-'&&b[b.size()-1]!='-'){
			if(a.size()>b.size())
			    return true;
			if(a.size()<b.size())
			    return false;
			else{
				for(int i=0;i<a.size();i++)
					if(a[i]>b[i]) return true;
				return false;
			}
		}
		else if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
			if(a.size()>b.size())
			    return true;
			if(a.size()<b.size())
			    return false;
			else{
				for(int i=1;i<a.size();i++){
					if(a[i]>b[i]) return true;
					if(a[i]<b[i]) return false;
				}
				return false;
			}
		}
		else if(a[a.size()-1]=='-'&&b[b.size()-1]!='-')
		    return false;
		else
		    return true;
	}
	bool less(high_pre_num a,high_pre_num b){//小于 
	    return greater(b,a);
	}
	bool equals(high_pre_num a,high_pre_num b){//等于 
		if(greater(a,b))
		    return false;
		else if(less(a,b))
		    return false;
		return true;
	}
	high_pre_num minus(high_pre_num a){//等于平时我们用的-a(a为一个变量) 
		if(a[a.size()-1]=='-')
		    a.pop_back();
		else
		    a+='-';
		return a;
	}
	high_pre_num add(high_pre_num a,high_pre_num b){//加法 
		high_pre_num s="";
		if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){
			a.pop_back();
			swap(a,b);
			bool k=0;
			if(less(a,b))
		    	swap(a,b),k=1;
			high_pre_num s="";
			int x=0,l=0;
			int lll=max(a.size(),b.size());
			for(int i=0;i<lll;i++){
				b+='0';
				a+='0';
		    	l=a[i]-'0'-b[i]+'0'-x;
		    	x=0;
		    	if(l<0){
		    		x++;
		    		l+=10;
				}
				char xx=(l+'0');
				s+=xx;
			}
			if(k)
		    	s+='-';
			return s;
		}
		if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){
			b.pop_back();
			bool k=0;
			if(less(a,b))
		    	swap(a,b),k=1;
			high_pre_num s="";
			int x=0,l=0;
			int lll=max(a.size(),b.size());
			for(int i=0;i<lll;i++){
				b+='0';
				a+='0';
		    	l=a[i]-'0'-b[i]+'0'-x;
		    	x=0;
		    	if(l<0){
		    		x++;
		    		l+=10;
				}
				char xx=(l+'0');
				s+=xx;
			}
			if(k)
		    	s+='-';
			return s;
		}
		bool k=0;
		if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
			b.pop_back();
			a.pop_back();
			k=1;
		}
		int x=0,l=0;
		int lll=max(a.size(),b.size());
		for(int i=0;i<=lll;i++){
			b+='0';
			a+='0';
		    l=a[i]-'0'+b[i]-'0'+x;
		    if(l==0&&i==lll)<%
			    break;
			%>
		    x=0;
		    if(l>=10){
		    	x+=l/10;
		    	l%=10;
			}
			char xx=(l+'0');
			s+=xx;
		}
		if(k)
		    s+='-';
		return s;
	}
	high_pre_num sub(high_pre_num a,high_pre_num b){//减法 
		if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){//被减数是负数时 
			a.pop_back();
			return add(a,b)+'-';
		}
		if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){//减数是负数时 
			b.pop_back();
			return add(a,b);
		}
		bool nnn=0;
		if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){//两个都是负数时 
			b.pop_back();
			a.pop_back();
			nnn=1;
		}
		bool k=0;
		if(less(a,b))//是负数 
		    swap(a,b),k=1;
		high_pre_num s="";
		int x=0,l=0;
		int lll=max(a.size(),b.size());
		for(int i=0;i<lll;i++){
			b+='0';
			a+='0';
		    l=a[i]-'0'-b[i]+'0'-x;
		    x=0;
		    if(l<0){
		    	x++;
		    	l+=10;
			}
			char xx=(l+'0');
			s+=xx;
		}
		if(k)//特判 
		    s+='-';
	    if(nnn)//特判 
		    s=minus(s); 
		return s;
	}
	int hpntoi(high_pre_num a){//转化为int(有个前提,不爆int) 
		reverse(a.begin(),a.end());
		return stoi(a);
	}
	long long hpntoll(high_pre_num a){//转化为long long(有个前提,不爆long long) 
		reverse(a.begin(),a.end());
		return stoll(a);
	}
	long hpntol(high_pre_num a){//转化为long(有个前提,不爆long) 
		reverse(a.begin(),a.end());
		return stol(a);
	}
	/* 
	high_pre_num mult(high_pre_num a,high_pre_num b){//没调好的乘法 
		bool k=0;
		high_pre_num s="";
		int x=0,l=0;
		int lll=max(a.size(),b.size());
		for(int i=0;i<=lll;i++){
			b+='0';
			a+='0';
		    l=(a[i]-'0')*(b[i]-'0')+x;
		    x=0;
		    if(l>9){
		    	x+=l/10;
		    	l%=10;
			}
			char xx=(l+'0');
			s+=xx;
		}
		return s;
	}
	*/
}

麻烦给个赞(你也可以不给),我是个小学生(不骗你!四年级,看我简介)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值