C++实现大数运算(加减乘除求余)

2023-11-20

前言:
只有部分GCC编译器支持int128,而我们平常使用的软件,最大只有_int64.当这些不够用时,我们该怎么办?

我本身想写代码实现整数型大数据的加减乘除和求余,结果写着写着想着连小数运算的也一起写上(反正加的代码不多)

电脑是死的,人是活的,当数据超出范围时,我们可以想其他方法去算,在这里,我使用string类来存数据,string类的容量足够大,相信够一般大数据使用了吧。

编译软件:vs2013

程序功能: 大型整数、小数的加、减、乘、除、求余

代码:

main.cpp

#include <iostream>
#include<string>
#include<cmath>
#include "large.h"
using namespace std;
int main()
{
	char ch;
	string m_snum1, m_snum2;
	while (cin>>m_snum1>>ch>>m_snum2)
	{
		large _large(m_snum1, ch, m_snum2);
	}
	return 0;
}

large.h

#include <iostream>
#include<string>
using namespace std;
class large
{
public:
	large(){}
	large(string m_str1, char m_ch, string m_str2);            //两数的运算
	inline int compare(string str1, string str2); //相等返回0,大于返回1,小于返回-1
	string SUB_INT(string str1, string str2);   //高精度减法
	string ADD_INT(string str1, string str2);         //高精度加法
	string MUL_INT(string str1, string str2);     //高精度乘法 
	string DIVIDE_INT(string str1, string str2, int flag); //高精度除法,flag==1,返回商;flag==0时,返回余数
	string DIV_INT(string str1, string str2); //高精度除法,返回商
	string MOD_INT(string str1, string str2);  //高精度除法,返回余数
	large(large &e);  //拷贝构造
	~large(){};   //析构函数
};

large.cpp

#include <iostream>
#include<string>
#include<cmath>
#include "large.h"
using namespace std;
large::large(string m_str1, char m_ch, string m_str2)//两数的运算
{
	
	int m_ilocation1 ;
	int m_ilocation2 ;
	string m_res;
	int m_istr;
	if (m_str1.find_first_of(".") == -1)
		m_ilocation1 = 0;
	else
		m_ilocation1 = m_str1.length() - m_str1.find_first_of(".") - 1;
	if (m_str2.find_first_of(".") == -1)
		m_ilocation2 = 0;
	else
		m_ilocation2 = m_str2.length() - m_str2.find_first_of(".") - 1;
	if (m_ilocation1 == 0 && m_ilocation2 == 0)
	{
		switch (m_ch)
		{
		case'+':
			m_res = ADD_INT(m_str1, m_str2); break;
		case'-':
			m_res = SUB_INT(m_str1, m_str2); break;
		case'*':
			m_res = MUL_INT(m_str1, m_str2); break;
		case'/':
			m_res = DIV_INT(m_str1, m_str2); break;
		case'%':
			m_res = MOD_INT(m_str1, m_str2); break;
		default:
			break;
		}
	}
		
	else
	{
		int m_ilocat = m_ilocation1 - m_ilocation2;
		int m_ilocation3;
		if (m_ilocation1!=0)
			m_str1.erase(m_str1.find_first_of("."), m_str1.find_first_not_of(".") + 1);
		if (m_ilocation2!=0)
			m_str2.erase(m_str2.find_first_of("."), m_str2.find_first_not_of(".") + 1);
		
		switch (m_ch)
		{
		case'+':
			if (m_ilocat >= 0)
			{
				for (int i = 0; i < m_ilocat; i++)
					m_str2 = m_str2 + '0';
				m_ilocation3 = m_ilocation1;
			}
			else
			{
				for (int i = 0; i < -m_ilocat; i++)
					m_str1 = m_str1 + '0';
				m_ilocation3 = m_ilocation2;
			}
			m_res = ADD_INT(m_str1, m_str2);
			m_istr = m_res.length();
			for (int i = 0; i < m_ilocation3; i++)
				m_istr = m_istr - 1;
			m_res.insert(m_istr, ".");
			break;
		case'-':
			if (m_ilocat >= 0)
			{
				for (int i = 0; i < m_ilocat; i++)
					m_str2 = m_str2 + '0';
				m_ilocation3 = m_ilocation1;
			}
			else
			{
				for (int i = 0; i < -m_ilocat; i++)
					m_str1 = m_str1 + '0';
				m_ilocation3 = m_ilocation2;
			}
			m_res = SUB_INT(m_str1, m_str2);
			m_istr = m_res.length();
			for (int i = 0; i < m_ilocation3; i++)
				m_istr = m_istr - 1;
			m_res.insert(m_istr, ".");
			 break;
		case'*':
			m_ilocation3=m_ilocation1+m_ilocation2;
			m_res = MUL_INT(m_str1, m_str2); 
			m_istr = m_res.length();
			for (int i = 0; i < m_ilocation3; i++)
				m_istr = m_istr - 1;
			m_res.insert(m_istr, "."); break;
		case'/':
			if (m_ilocat >= 0)
			{
				for (int i = 0; i < m_ilocat; i++)
					m_str2 = m_str2 + '0';
			}
			else
			{
				for (int i = 0; i < -m_ilocat; i++)
					m_str1 = m_str1 + '0';
			}
			m_res = DIV_INT(m_str1, m_str2); break;
		case'%':
			m_res = MOD_INT(m_str1, m_str2); break;
		default:
			break;
		}
		

	}
	cout << endl;
	cout << m_res << endl;
}
inline int large::compare(string str1, string str2) //相等返回0,大于返回1,小于返回-1
{
	if (str1.size() > str2.size())
		return 1;
	else if (str1.size() < str2.size())
		return -1;
	else return str1.compare(str2);     //若长度相等,则从头到尾按位比较
}
string large::ADD_INT(string str1, string str2)         //高精度加法
{
	int sign = 1;//sign为符号为
	string str;
	if (str1[0] == '-')
	{
		if (str2[0] == '-')       //负负
		{
			sign = -1;
			str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1));//erase(first,last);删除从first到last之间的字符
		}
		else             //负正
		{
			str = SUB_INT(str2, str1.erase(0, 1));
		}
	}
	else
	{
		if (str2[0] == '-')        //正负
		{
			str = SUB_INT(str1, str2.erase(0, 1));
		}
		else                    //正正,把两个整数对齐,短整数前面加0补齐
		{
			string::size_type L1, L2;  //string::size_type抽象意义是尺寸单位类型
			int i;
			L1 = str1.size();
			L2 = str2.size();
			if (L1 < L2)
			{
				for (i = 0; i < L2 - L1; i++)
					str1 = "0" + str1;
			}
			else
			{
				for (i = 0; i < L1 - L2; i++)
					str2 = "0" + str2;
			}
			int int1 = 0, int2 = 0; //int2记录进位
			for (i = str1.size() - 1; i >= 0; i--)
			{
				int1 = (int(str1[i]) - '0' + int(str2[i]) - '0' + int2) % 10;
				int2 = (int(str1[i]) - '0' + int(str2[i]) - '0' + int2) / 10;
				str = char(int1 + '0') + str;
			}
			if (int2 != 0)str = char(int2 + '0') + str;
		}

	}
	//运算符处理符号
	if ((sign == -1) && (str[0] != '0'))str = "-" + str;
	return str;
}

string large::SUB_INT(string str1, string str2)  //高精度减法
{
	int sign = 1; //sign为符号位
	string str;
	int i, j;
	if (str2[0] == '-')
	{
		str = ADD_INT(str1, str2.erase(0, 1));
	}
	else
	{
		int res = compare(str1, str2);
		if (res == 0)return "0";
		if (res < 0)
		{
			sign = -1;
			string temp = str1;
			str1 = str2;
			str2 = temp;
		}
		string::size_type tempint;
		tempint = str1.size() - str2.size();
		for (i = str2.size() - 1; i >= 0; i--)
		{
			if (str1[i + tempint] < str2[i])          //借位
			{
				j = 1;
				while (1)
				{
					if (str1[tempint - j + i] == '0')
					{
						str1[i + tempint - j] = '9';
						j++;
					}
					else
					{
						str1[i + tempint - j] = char(int(str1[i + tempint - j]) - 1);
						break;
					}
				}
				str = char(str1[i + tempint] - str2[i] + ':') + str;
			}
			else
			{
				str = char(str1[i + tempint] - str2[i] + '0') + str;
			}
		}
		for (i = tempint - 1; i >= 0; i--)
			str = str1[i] + str;
	}
	//去出结果中多余的前导0
	str.erase(0, str.find_first_not_of('0'));
	if (str.empty())str = "0";
	if ((sign == -1) && (str[0] != '0'))str = "-" + str;
	return str;
}

string large::MUL_INT(string str1, string str2)     //高精度乘法 
{
	int sign = 1;
	string str = "0";        //记录当前值
	if (str1[0] == '-')
	{
		sign *= -1;
		str1 = str1.erase(0, 1);
	}
	if (str2[0] == '-')
	{
		sign *= -1;
		str2 = str2.erase(0, 1);
	}
	int i, j;
	string::size_type L1, L2;
	L1 = str1.size();
	L2 = str2.size();
	for (i = L2 - 1; i >= 0; i--)              //模拟手工乘法竖式
	{
		string tempstr;
		int int1 = 0, int2 = 0, int3 = int(str2[i]) - '0';
		if (int3 != 0)
		{
			for (j = 1; j <= (int)(L2 - 1 - i); j++)
				tempstr = "0" + tempstr;
			for (j = L1 - 1; j >= 0; j--)
			{
				int1 = (int3*(int(str1[j]) - '0') + int2) % 10;
				int2 = (int3*(int(str1[j]) - '0') + int2) / 10;
				tempstr = char(int1 + '0') + tempstr;
			}
			if (int2 != 0)tempstr = char(int2 + '0') + tempstr;
		}
		str = ADD_INT(str, tempstr);
	}
	//去除结果中的前导0
	str.erase(0, str.find_first_not_of("0"));
	if (str.empty())str = "0";
	if ((sign == -1) && (str[0] != '0'))str = "-" + str;
	return str;
}

string large::DIVIDE_INT(string str1, string str2, int flag) //高精度除法,flag==1,返回商;flag==0时,返回余数
{
	string quotient, residue;  //定义商和余数
	int sign1 = 1, sign2 = 1;
	if (str2 == "0")   //判断除数是否为0
	{
		quotient = "ERROR!";
		residue = "ERROR!";
		if (flag == 1)return quotient;
		else return residue;
	}
	if (str1 == "0")     //判断被除数是否为0
	{
		quotient = "0";
		residue = "0";
	}
	if (str1[0] == '-')
	{
		str1 = str1.erase(0, 1);
		sign1 *= -1;
		sign2 = -1;
	}
	if (str2[0] == '-')
	{
		str2 = str2.erase(0, 1);
		sign1 *= -1;
	}
	int res = compare(str1, str2);
	if (res < 0)
	{
		quotient = "0";
		residue = str1;
	}
	else if (res == 0)
	{
		quotient = "1";
		residue = "0";
	}
	else
	{
		string::size_type L1, L2;
		L1 = str1.size();
		L2 = str2.size();
		string tempstr;
		tempstr.append(str1, 0, L2 - 1); //将str1中为值0到L2-1的字符串追加到tempstr
		for (int i = L2 - 1; i < L1; i++)  //模拟手工除法竖式
		{
			tempstr = tempstr + str1[i];
			tempstr.erase(0, tempstr.find_first_not_of('0')); //在字符串中查找第一个与'0'不匹配的字符,返回它的位置
			if (tempstr.empty())tempstr = "0";  //q.empty(),当队列空时,返回true
			for (char ch = '9'; ch >= '0'; ch--) //试商
			{
				string str;
				str = str + ch;
				if (compare(MUL_INT(str2, str), tempstr) <= 0)
				{
					quotient = quotient + ch;
					tempstr = SUB_INT(tempstr, MUL_INT(str2, str));
					break;
				}
			}
		}
		residue = tempstr;
	}
	//去除结果中的前导0
	quotient.erase(0, quotient.find_first_not_of("0"));
	if (quotient.empty())quotient = "0";
	if ((sign1 == -1) && (quotient[0] != '0'))quotient = "-" + quotient;
	if ((sign2 == -1) && (residue[0] != '0'))residue = "-" + residue;
	if (flag == 1)return quotient;
	else
		return residue;
}
string large::DIV_INT(string str1, string str2) //高精度除法,返回商
{
	return DIVIDE_INT(str1, str2, 1);
}
string large::MOD_INT(string str1, string str2)  //高精度除法,返回余数
{
	return DIVIDE_INT(str1, str2, 0);
}

运行结果展示:
例子:多位数的小数相加:

这下子就不怕数据超出范围了,欢迎一起探讨,一起交流。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现大数运算(加减乘除求余) 的相关文章

  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • QSpinBox修改样式 去掉上下键

    1 找到QSpinBox控件 右键 改变样式表 将以下代码粘贴进去 QSpinBox border 1px solid 242424 QSpinBox up button QSpinBox down button width 0px 修改前
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • 【Android -- 面试】Android 知识点(四大组件)

    目录 文章目录 目录 Activity Fragment Service Broadcast Receiver ContentProvider Activity 1 说下 Activity 的生命周期 参考回答 在 Activity 的生命
  • Syntax Error: Error: PostCSS received undefined instead of CSS string

    Syntax Error Error PostCSS received undefined instead of CSS string Module Error from node modules sass loader dist cjs
  • 异步Buck和同步Buck的特点

    1 介绍 随着时代的发展 工业 车载 通信 消费类等产品都提出了小型化 智能化的需求 相应的 对于这些系统中的电源模块提出了小型化的要求 目前 市场上依然存在很多异步Buck电源管理芯片使用的场景 针对这些应用 采用同步Buck电源管理芯片
  • 今日热榜前 5 的 GitHub 项目

    今日开源热榜 Top5 项目目录 1 纪念左耳朵耗子 2 你的第二大脑 3 大模型开发人员需要记住的数 4 短链接管理工具 5 StableStudio 01 纪念左耳朵耗子 MegaEase 创始人兼 CEO 陈皓 网名 左耳朵耗子 于上
  • VSCode搭建ARM(STM32开发环境)

    目录 需要用到的工具 软件安装 下载安装 Visual Studio Code 下载安装 STM32Cubemx 下载安装 ARM GCC交叉编译工具链 下载安装 Msys2 下载安装 OpenOCD 下载安装 Make 开发环境配置 ms
  • 虚拟机扩容,解决虚拟机磁盘根目录不足

    当你打开虚拟机时会提示 你的磁盘根目录不足 这表明你需要对自己的虚拟机进行扩容 详细步骤如下 第一步 你需要将自己的虚拟机关机 即关闭电源 第二步 右键你需要扩容的虚拟机 然后点击设置 第三步 点击硬盘 第四步 点击右边进行扩容 将磁盘容量
  • 小米手机无法调试应用解决Installation failed with message Failed to establish session.

    小米手机性价比高 有些问题也很尖锐 比如我的5S用了黑科技 试验品 超声波指纹解锁 识别率就很低 每次解锁都要哈口气 真后悔 而且最近又遇到新问题 我的小米5S无法通过android studio调试应用 卖批啊 但即使这样也比蓝绿工程的O
  • Java集合之单列集合

    分类 集合分为单列集合 Collection 和双列集合 Map 单列集合的体系结构 List集合和Set集合的区别 List系列集合 添加元素是有序的 添加的顺序 而非数据的大小顺序 可重复 有索引 Set系列集合 添加的元素是无序的 添
  • erlang escript使用

    Erlang scripting support 让erlang可以向unix script 一样做脚本使用 script name script arg1 script arg2 escript escript flags script
  • 使用Flask+mysql开发一套自己的搜索引擎(附源码)

    使用Flask mysql开发一套自己的搜索引擎 附源码 前言 主要是针对在内网办公的朋友 可以把这一套部署到单机或者公司服务器 做一些名词查询 语言翻译的功能 如果需要的话可以扩展一下 搞成一套类似于内网网盘的软件 这个我们下期再讲 这期
  • 手游幻想神域服务器显示,幻想神域手游最详细攻略介绍

    幻想神域 是一款公测于2018年的动漫手游 是角色扮演类的游戏 游戏凭借二次元的日系风格 Q萌的人物画风 饱满的人物设定而吸引了很多玩家 游戏玩得多的人得心应手 但是玩得比较少的可能会有点摸不着头脑 那么接下来就给大家介绍一下 幻想神域 的
  • 接口的幂等性设计

    在高并发或者是安全要求下 后端接口会有多次执行的结果与一次执行的结果要一致的要求 这种接口就叫幂等性接口 需要用到幂等性的接口比较常见的就是用户下单支付等 防止出现重试时对业务造成巨大灾害的危险 下文为设计方案的各个要点 前端幂等控制 按钮
  • Qt使用QChart制作多路虚拟示波器

    使用QT做虚拟示波器 共16通道 波形是重叠在一起 不同颜色区分 想用写好的TCP传输来让单片机与电脑通信 解刨数据 放入到示波器中进行显示 准备工作 首先我缺一个绘图的控件 于是在网上找了找 网上给我介绍的有三种 分别是qcustompl
  • C、C++、C#、python、java编程—函数

    C资料 菜鸟教程 C语言中文网 C community C 资料 菜鸟教程 cplusplus C community C 资料 菜鸟教程 microsoftC 文档 python资料 菜鸟教程 python标准库 Java资料 菜鸟教程
  • 【Ansible故障解决】解决Ansible初始连接host服务器需验证问题

    Ansible故障解决 解决Ansible初始连接host服务器需验证问题 一 ansible介绍 二 修改ansible cfg配置文件 1 ansible的配置文件修改 2 修改配置文件中的其他部分 3 编辑主机清单 三 测试ansib
  • sh、bash 和 dash 几种 shell 的区别是什么?

    在调试基于 Debian 的 Docker 镜像时 进入容器后在终端中按上箭头键后终端显示 A 下箭头显示 B 右箭头显示 C 左箭头显示 D 按删除键也是显示了几个特殊字符 很奇怪 仔细看了一下 原来进入容器的时候终端使用的 sh 切换为
  • iPhone惊爆史诗级漏洞:亿万台手机可永久越狱 苹果无法修复

    在我认为完美越狱已死的时候没想到国外大神爆出了一个 不可修补 iPhone漏洞 这个漏洞会让iPhone永久越狱从iPhone 4S到iPhone X的所有设备均会受到影响 但是目前还是不支持A12芯片的 据发现它的安全研究员axi0mX称
  • C++实现大数运算(加减乘除求余)

    前言 只有部分GCC编译器支持int128 而我们平常使用的软件 最大只有 int64 当这些不够用时 我们该怎么办 我本身想写代码实现整数型大数据的加减乘除和求余 结果写着写着想着连小数运算的也一起写上 反正加的代码不多 电脑是死的 人是