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

发布于:2025-04-11 ⋅ 阅读:(40) ⋅ 点赞:(0)

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

简介

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

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

#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;
}

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

#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;
}

#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以外的数会有提示)

#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;
}