首页 > 编程语言 >算法模板(1)——高精度

算法模板(1)——高精度

时间:2023-08-23 19:46:31浏览次数:48  
标签:set return 高精度 int Big -- 算法 num 模板

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MR=1e3+2;

struct Big{
	int l;
	int num[MR];
	void set(string s){
		//用s设置l与num[]的值
		l = s.size();
    	for (int i = 1;i <= l;i++) num[i] = s[l - i] - '0';
	}
	void set(int x){
		set(to_string(x));
	}
	void print(){
		for(int i = l;i >= 1;i--){
			cout <<num[i];
		}
	}
};

bool operator<(Big x,Big y){
	if(x.l!=y.l) return x.l<y.l;
	for(int i = x.l;i >= 1;i--){
		if(x.num[i]!=y.num[i]) return x.num[i]<y.num[i];
	}
	return 0;
}

Big operator+(Big a,Big b){
	Big c;
	int al=a.l,bl=b.l;
	int cl=max(al,bl);
	int u=0;
    for (int i = 1;i <= cl;i++) {
    	if(i<=al) u+=a.num[i];
    	if(i<=bl) u+=b.num[i];
    	c.num[i]=u%10;
    	u/=10;
    }
    if(u>0){
    	cl++;
    	c.num[cl]=u;
    }
    c.l=cl;
    return c;
}

Big operator-(Big a,Big b){
	Big c;
	c.l=a.l;
	int u=0;
	for (int i = 1;i <= c.l;i++) {
    	u+=a.num[i];
    	if(i<=b.l) u-=b.num[i];
    	
    	if(u<0){
    		c.num[i]=u+10;
    		u=-1;
    	}
    	else{
    		c.num[i]=u;
    		u=0;
    	}
	}
	while(c.l>1&&c.num[c.l]==0) c.l--;
	return c;
}

Big operator*(Big a,int b){
	Big c;
	int al=a.l;
	c.l=al;
	long long u=0;
	for(int i = 1;i <= c.l;i++){
		u+=1ll*a.num[i]*b;
		c.num[i]=u%10;
		u/=10;
	}
	while(u>0){
		c.l++;
		c.num[c.l]=u%10;
		u/=10;
	}
	return c;
}

Big operator/(Big a,int b){
	Big c;
	c.l=a.l;
	long long r=0;
	for(int i = c.l;i >= 1;i--){
		r=r*10+a.num[i];
		c.num[i]=r/b;
		r%=b;
	}
	while(c.num[c.l]==0&&c.l>1) c.l--;
	return c;
}
int main(){
	char x;
	string a;
	Big A,B;
	
	cin >> x >> a;
	A.set(a);
	if(x=='+'){
		string b;
		cin >> b;
		B.set(b);
		A=A+B;
		A.print();
	}
	else if(x=='-'){
		string b;
		cin >> b;
		Big B,C;
		B.set(b);
		if(A<B) C=B-A;
		else C=A-B;
		C.print();
	}
	else if(x=='*'){
		int b;
		cin >>  b;
		A=A*b;
		A.print();
	}
	else if(x=='/'){
		int b;
		cin >> b;
		A=A/b;
		A.print();
	}
	return 0;
}

/*
高精乘高精:
for(int i =1 ;i<=al;i++)
	for(int j = 1;j <= bl;j++)
		c.num[i+j-1]+=a[i]*b[j];
*/

标签:set,return,高精度,int,Big,--,算法,num,模板
From: https://www.cnblogs.com/andy561/p/gaojingdu.html

相关文章

  • 《408操作系统 》复习笔记 ③ 第二章 调度与调度算法
    调度当有一堆任务要处理,由于资源有限,没办法同时处理。需要某种规则来决定处理这些任务的顺序作业作业:一个具体的任务用户向系统提交一个作业=用户让操作系统启动一个程序(来处理一个具体的任务)调度的三个层次高级调度(作业调度)按照某种策略从外存的作业后备队列中挑选......
  • 【成果展示】go-astilectron实现的算法工具
    仓库地址:https://github.com/go-astilectron-demo-crypt_tools......
  • 排序算法总结
    排序算法复杂度比较 快速排序 基准元素的选取会影响复杂度,最坏的情况可能到O(n2)选取区间起始元素选取区间结束元素在区间内随机选取一元素publicclassSort_QuickSort{publicstaticvoidmain(String[]args){int[]nums=newint[]{6,9,1,4,8......
  • 基于机器视觉工具箱的车辆检测计数算法matlab仿真
    1.算法理论概述1.1、研究背景      随着城市化进程的加速和汽车保有量的增加,交通拥堵和交通事故等交通问题日益突出,如何对城市交通进行有效管理和调控成为了城市交通管理的重要任务。车辆检测计数是交通管理中的一个重要问题,它可以用于交通状况的监测、交通流量的统计以......
  • Lnton羚通视频算法算力云平台【PyTorch】教程:学习基础知识如何保存和加载模型
    保存和加载模型是指将训练好的神经网络模型保存到文件中,以便在需要时重新加载该模型进行预测、推断或继续训练。保存模型的过程是将模型的参数和其他相关信息(如优化器状态等)保存到文件中。通过保存模型,我们可以在不重新训练的情况下保留模型的状态,方便后续使用。加载模型的过程是从......
  • 文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题
    五、如果用go语言,当输入数据已经“几乎有序”时,插入排序速度很快。在实际应用中,我们可以利用这一特点来提高快速排序的速度。当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。当上层的快速排序调用返回后,对整个数组运行插人排序来完成排序过程。试证明:这一排序......
  • LeetCode 算法题解之 26 进制转换 All In One
    LeetCode算法题解之26进制转换AllInOne26进制转换171.ExcelSheetColumnNumber171.Excel工作表列号functiontitleToNumber(columnTitle:string):number{//如何动态生成字典✅26进制//A-Z->1-26conststrs='ABCDEFGHIJKLMNOPQRSTUVWXYZ';......
  • 昨晚做梦面试官问我三色标记算法
    本文已收录至GitHub,推荐阅读......
  • 【算法学习笔记】max-min容斥 极值反演
    max-min容斥(极值反演)即为下式;\[\begin{equation}\max\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\min\{T\}\label{aa}\end{equation}\]\[\begin{equation}\min\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\max\{T\}\label{ab}\end{equation}\]证明:证明\(\ref......
  • 【操作系统-进程】进程的调度算法
    目录0进程调度算法的性能指标1【非抢占式】先来先服务(FCFS)调度算法2【非抢占式+抢占式】短进程优先(SPF)调度算法2.1【非抢占式】短进程优先(SPF)调度算法2.2【抢占式】最短剩余时间(SRTN)优先算法3【非抢占式】高响应比优先(HRRN)调度算法4【抢占式】时间片轮转(RR)调度算法案例一:时......