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;
}
相关推荐
j7~31 分钟前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制
维吉斯蔡8 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
luj_176810 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT10 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
xcLeigh10 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
zmzb010311 小时前
C++课后习题训练记录Day175
开发语言·c++
啦啦啦啦啦zzzz11 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
脱胎换骨-军哥11 小时前
C++ 代码规范与格式化指南
开发语言·c++·代码规范
枕星而眠12 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
geats人山人海13 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法