专栏文章

高精度头文件

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mir1sl2d
此快照首次捕获于
2025/12/04 14:21
3 个月前
此快照最后确认于
2025/12/04 14:21
3 个月前
查看原文
CPP
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define ps __gnu_pbds
#define tree ps::tree<pair<int,int>,ps::null_type,less<pair<int,int> >,ps::rb_tree_tag,ps::tree_order_statistics_node_update>
namespace high_precision{
	string s1,s2;
	const int PREABMX=5005,PRECMX=25000005;
	int a[PREABMX]={0},b[PREABMX]={0},c[PRECMX]={0},resn=0,isf=0;
	void init_a(){
		for(int i=s1.length()-1;i>=0;i--){
			int k=s1.length()-i;
			a[k]=s1[i]-'0';
		}
		return;
	}
	void init_b(){
		for(int i=s2.length()-1;i>=0;i--){
			int k=s2.length()-i;
			b[k]=s2[i]-'0';
		}
		return;
	}
	void addition(){
		isf=0;
		int mxn=max(s1.length(),s2.length()),jin=0;
		for(int i=1;i<=mxn;i++){
			c[i]=a[i]+b[i]+jin;
			jin=0;
			if(c[i]>=10) c[i]-=10,jin=1;
		}
		if(jin) resn=mxn+1,c[resn]=1;
		else resn=mxn;
	}
	void multiplication(){
		int lena=s1.length();
		int lenb=s2.length();
		resn=0,isf=0;
		for(int i=1;i<=lenb;i++){
			int jin=0;
			for(int j=1;j<=lena;j++){
				resn=max(resn,i+j-1);
				c[i+j-1]+=b[i]*a[j]+jin;
				jin=0;
				if(c[i+j-1]>=10) jin=c[i+j-1]/10,c[i+j-1]%=10;
			}
			if(jin) c[lena+i]=jin,resn=max(resn,(int)(lena+i));
		}
	}
	void subtraction(){
		resn=0,isf=0;
		int mxn=max(s1.length(),s2.length()),jin=0;
		for(int i=mxn;i>=1;i--){
			if(a[i]<b[i]){
				swap(a,b);
				isf=1;
				break;
			}else if(a[i]>b[i]){
				break;
			} 
		}
		for(int i=1;i<=mxn;i++){
			c[i]=a[i]-b[i]-jin;
			jin=0;
			if(c[i]<0){
				c[i]+=10;
				jin=1;
			}
		}
		resn=mxn;
	}
	void division_int(long long x){
		long long yu=0;
		for(int i=s1.length();i>=1;i--){
			yu=yu*10+a[i];
			c[i]=yu/x;
			yu=yu%x;
		}
		resn=s1.length();
	}
	void high_min(){
		int lena=s1.length();
		int lenb=s2.length();
		int k=1;
		for(int i=max(lena,lenb);i>=1;i--){
			if(a[i]>b[i]){
				k=2;
				break;
			}else if(a[i]<b[i]){
				break;
			}
		}
		if(k==1){
			for(int i=lena;i>=1;i--){
				c[i]=a[i];
			}
			resn=lena;
		}else{
			for(int i=lenb;i>=1;i--){
				c[i]=b[i];
			}
			resn=lenb;
		}
	}
	void high_max(){
		int lena=s1.length();
		int lenb=s2.length();
		int k=1;
		for(int i=max(lena,lenb);i>=1;i--){
			if(a[i]>b[i]){
				break;
			}else if(a[i]<b[i]){
				k=2;
				break;
			}
		}
		if(k==1){
			for(int i=lena;i>=1;i--){
				c[i]=a[i];
			}
			resn=lena;
		}else{
			for(int i=lenb;i>=1;i--){
				c[i]=b[i];
			}
			resn=lenb;
		}
	}
	void print(){
		if(isf) printf("-"),isf=0; 
		int k=resn;
		while(c[k]==0&&k>1) k--;
		for(int i=k;i>=1;i--){
			printf("%d",c[i]);
		}
	}
	int fstring(long long x){
		int k=0;
		while(x){
			b[++k]=x%10;
			x/=10;
		}
		return k;
	}
}
using namespace high_precision;
使用说明:粘贴至代码中,先输入s1,s2,再运行init_a(),init_b(),再运行对应的高精度函数即可

评论

0 条评论,欢迎与作者交流。

正在加载评论...