当前位置: 首页 > news >正文

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

首先声明,没有除法是因为我不会(手动狗头_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;
}

http://www.dtcms.com/a/121978.html

相关文章:

  • 【C++】 —— 笔试刷题day_13
  • 抽象类及其特性
  • cpp(c++)win 10编译GDAL、PROJ、SQLite3、curl、libtiff
  • Easysearch VS Opensearch 数据写入与存储性能对比
  • HOW - 实现 useClickOutside 或者 useClickAway
  • 大模型本地部署系列(1) Ollama的安装与配置
  • 神经网络 | 基于脉冲耦合神经网络PCNN图像特征提取与匹配(附matlab代码)
  • 408 计算机网络 知识点记忆(6)
  • Elasticsearch DSL 中的 aggs 聚合分析
  • 数据结构实验3.3:求解迷宫路径问题
  • 西门子S7-1500与S7-200SMART通讯全攻略:从基础配置到远程IO集成
  • SQL注入(SQL Injection)
  • Ollama 与 llama.cpp 深度对比
  • [特殊字符]【高并发实战】Java Socket + 线程池实现高性能文件上传服务器(附完整源码)[特殊字符]
  • 虽然理解git命令,但是我选择vscode插件!
  • Databricks: Why did your cluster disappear?
  • 【UE5】RTS游戏的框选功能+行军线效果实现
  • Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结
  • WPF 绑定方式举例
  • LabVIEW 图像处理中常见的边缘检测算法
  • 发票真伪查验接口集成攻略-PHP批量查验发票真伪
  • 贪心算法(17)(java)可被三整除的最大整数和
  • [CISSP] [9] 安全漏洞,威胁和对策
  • 视觉分析AI赋能智慧水务多场景应用
  • S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域
  • doxygen自动生成文档,注释容易错位的补充
  • 雷电模拟器过检测技术全解析
  • 使用docker 安装向量数据库Milvus
  • 黑马 SpringAI+DeepSeek 实战:从对话机器人到企业级知识库的大模型开发全攻略
  • <《AI大模型应知应会100篇》第8篇:大模型的知识获取方式及其局限性