C++高精度算法(加、减、乘)

首先声明,没有除法是因为我不会(手动狗头_doge)

简介

顾名思义,高精度算法是用来算一些超级大的数,比如长到 longlong 都存不下的那种,还有就是小数点后好多位,double都存不下的那种,今天我写的是第一种------大数。

注意!!!不要输入负数!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{
	cin>>a>>b;
	cout<<func(a,b);
	
	
	return 0;
}
string func(string x,string y)
{
	int n[1000]={0};
	int m[1000]={0};
	int s[1000]={0};
	//1.把用户输入的数转进一个个int,每个数位占一个空间
	//由于数组特性,还要把整个数字反转过来,方便后续处理
	int la=x.size();
	int lb=y.size();
	for(int i=0;i<la;i++)
	{
		n[la-1-i]=x[i]-48;
	}
	for(int i=0;i<lb;i++)
	{
		m[lb-1-i]=y[i]-48;
	}
	
	//2.逐位相加,暂时不进位
	for(int i=0;i<max(la,lb);i++)
	{
		s[i]=n[i]+m[i];
	}
	
	//3.进位
	for(int i=0;i<max(la,lb);i++)
	{
		if(s[i]>=10)
		{
			s[i+1]++;
			s[i]=s[i]-10;
		}
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=max(la,lb)+1;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.读取运算结果,转入string
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	return ss;
}

(自动选取大数减去小数)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{
	cin>>a>>b;
	cout<<func(a,b);
	
	
	return 0;
}
string func(string x,string y)
{
	//备注:f为true是m比n大,反之亦然
	
	//1.首先要反转数组,再比出两个数哪个大,因为负数不好处理
	//相等直接输出0
	if(x==y)return 0;
	int n[10010]={0};
	int m[10010]={0};
	int s[10010]={0};//最终答案所在数组
	int ln=x.size();
	int lm=y.size();
	bool f=true;
	for(int i=0;i<ln;i++)
	{
		n[ln-1-i]=x[i]-48;
	}
	for(int i=0;i<lm;i++)
	{
		m[lm-1-i]=y[i]-48;
	}
	
	//比大小
	if(ln>lm)
	{
		f=false;
	}
	else if(ln==lm&&x>y)
	{
		f=false;
	}
	
	//2.分情况进行计算
	if(f==true)
	{
		for(int i=0;i<lm;i++)
		{
			s[i]=m[i]-n[i];
		}
	}
	else
	{
		for(int i=0;i<ln;i++)
		{
			s[i]=n[i]-m[i];
		}
	}
	
	//3.退位
	for(int i=0;i<max(ln,lm);i++)
	{
		if(s[i]<0)
		{
			s[i+1]--;
			s[i]+=10;
		}
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=max(ln,lm)+1;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.输出结果
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	return ss;
}

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{
	cin>>a>>b;
	cout<<func(a,b);
	
	
	return 0;
}
string func(string x,string y)
{
	int n[10010]={0};
	int m[10010]={0};
	int s[20020]={0};
	int ln=x.size();
	int lm=y.size();
	//1.反转数字
	for(int i=0;i<ln;i++)
	{
		n[ln-1-i]=x[i]-48;
	}
	for(int i=0;i<lm;i++)
	{
		m[lm-1-i]=y[i]-48;
	}
	
	//2.逐位相乘,错位相加
	for(int i=0;i<lm;i++)
	{
		for(int j=0;j<ln;j++)
		{
			s[i+j]+=m[i]*n[j];
		}
	}
	
	//3.进位
	for(int i=0;i<ln+lm;i++)
	{
		s[i+1]+=s[i]/10;
		s[i]=s[i]%10;
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=ln+lm;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.输出结果
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	if(p==-1)
	{
		return "0";
	}
	return ss;
}

加减乘混合

(输入两个数以后再次输入一个数,1是加法,2是减法,3是乘法)

(别想了,输入123以外的数会有提示)

cpp 复制代码
#include<bits/stdc++.h>
#include<string.h>
#include<string>
using namespace std;
string a;
string b;
string funcjia(string,string);
string funcjian(string,string);
string funccheng(string,string);
int main()
{
	cin>>a>>b;
	int t;
	cin>>t;
	if(t==1)
	{
		cout<<funcjia(a,b);
	}
	else if(t==2)
	{
		cout<<funcjian(a,b);
	}
	else if(t==3)
	{
		cout<<funccheng(a,b);
	}
	else
	{
		cout<<"Sorry,I can't find it.";
	}
	
	
	return 0;
}
string funcjia(string x,string y)
{
	int n[1000]={0};
	int m[1000]={0};
	int s[1000]={0};
	//1.把用户输入的数转进一个个int,每个数位占一个空间
	//由于数组特性,还要把整个数字反转过来,方便后续处理
	int ln=x.size();
	int lm=y.size();
	for(int i=0;i<ln;i++)
	{
		n[ln-1-i]=x[i]-48;
	}
	for(int i=0;i<lm;i++)
	{
		m[lm-1-i]=y[i]-48;
	}
	
	//2.逐位相加,暂时不进位
	for(int i=0;i<max(ln,lm);i++)
	{
		s[i]=n[i]+m[i];
	}
	
	//3.进位
	for(int i=0;i<max(ln,lm);i++)
	{
		if(s[i]>=10)
		{
			s[i+1]++;
			s[i]=s[i]-10;
		}
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=max(ln,lm)+1;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.读取运算结果,转入string
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	return ss;
}
string funcjian(string x,string y)
{
	//备注:f为true是m比n大,反之亦然
	
	//1.首先要反转数组,再比出两个数哪个大,因为负数不好处理
	//相等直接输出0
	if(x==y)return 0;
	int n[10010]={0};
	int m[10010]={0};
	int s[10010]={0};//最终答案所在数组
	int ln=x.size();
	int lm=y.size();
	bool f=true;
	for(int i=0;i<ln;i++)
	{
		n[ln-1-i]=x[i]-48;
	}
	for(int i=0;i<lm;i++)
	{
		m[lm-1-i]=y[i]-48;
	}
	
	//比大小
	if(ln>lm)
	{
		f=false;
	}
	else if(ln==lm&&x>y)
	{
		f=false;
	}
	
	//2.分情况进行计算
	if(f==true)
	{
		for(int i=0;i<lm;i++)
		{
			s[i]=m[i]-n[i];
		}
	}
	else
	{
		for(int i=0;i<ln;i++)
		{
			s[i]=n[i]-m[i];
		}
	}
	
	//3.退位
	for(int i=0;i<max(ln,lm);i++)
	{
		if(s[i]<0)
		{
			s[i+1]--;
			s[i]+=10;
		}
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=max(ln,lm)+1;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.输出结果
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	return ss;
}
string funccheng(string x,string y)
{
	int n[10010]={0};
	int m[10010]={0};
	int s[20020]={0};
	int ln=x.size();
	int lm=y.size();
	//1.反转数字
	for(int i=0;i<ln;i++)
	{
		n[ln-1-i]=x[i]-48;
	}
	for(int i=0;i<lm;i++)
	{
		m[lm-1-i]=y[i]-48;
	}
	
	//2.逐位相乘,错位相加
	for(int i=0;i<lm;i++)
	{
		for(int j=0;j<ln;j++)
		{
			s[i+j]+=m[i]*n[j];
		}
	}
	
	//3.进位
	for(int i=0;i<ln+lm;i++)
	{
		s[i+1]+=s[i]/10;
		s[i]=s[i]%10;
	}
	
	//4.在数组结尾处做标记,方便读取
	int p=-1;
	for(int i=ln+lm;i>=0;i--)
	{
		if(s[i]!=0)
		{
			p=i;
			break;
		}
	}
	
	//5.输出结果
	string ss="";
	for(int i=0;i<=p;i++)
	{
		ss=(char)(s[i]+48)+ss;
	}
	if(p==-1)
	{
		return "0";
	}
	return ss;
}
相关推荐
慕容静漪15 分钟前
本地部署Code Llama大模型结合Text generation Web UI远程运行LLM
开发语言·后端·golang
zilong_zzz20 分钟前
系统编程3(共享内存/信号量)
java·开发语言
baobao176764083023 分钟前
C语言进阶之字符函数和字符串函数
c语言·算法
肾透侧视攻城狮29 分钟前
深入浅出一下Python函数的核心概念与进阶应用
开发语言·python·map·filter·闭包·reduce·py偏函数
zy01010133 分钟前
useEffect
开发语言·前端·javascript·react·useeffect
五行星辰36 分钟前
SAX解析XML:Java程序员的“刑侦破案式“数据处理
xml·java·开发语言
kovlistudio38 分钟前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
Kita~Ikuyo44 分钟前
基础数学:图论与信息论
python·算法·llm·图论
地球驾驶员1 小时前
NX二次开发C#---搭建NX开发环境(NX1926+VS2019)
开发语言·c#
烟锁池塘柳01 小时前
【数学建模】(智能优化算法)粒子群优化算法(PSO)详解与Python实现
算法·数学建模