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;
}
相关推荐
octopus_c1 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
李妍.7 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy7 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
YH55269847 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
吃着火锅x唱着歌7 小时前
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称
c++·笔记·学习
AI_小站8 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
felixking8 小时前
C++20 协程
开发语言·c++·协程
遥感知识服务9 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶9 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆9 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构