IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言大数加减法-优化版 -> 正文阅读

[C++知识库]C语言大数加减法-优化版

前言

??本文用C语言实现了大数加减法, 最多支持127位数加减(结果是127位) 不支持负数加减法, 不过可以做少许修改添加对负数的支持。其中减法部分用宏注释了之前的代码, 现在是优化后的代码。

友情链接

??整体源码及效果图见此: xin9912的NoteHub-大数加减法

加法部分

??加法部分两个数从低到高依次相加即可, 然后再从低到高处理进位。再处理结果即可, 代码如下:

int bigNumSum(char rst[],char a[],char b[],int numa,int numb)
{
	int i,high,low;
	char *pHigh = NULL,*pLow = NULL;
	
   /*    为了做统一,始终以位数最多作为最后标准     */
	(numa < numb) ? ((high = numb) & (low = numa)) : ((high = numa) & (low = numb));
	(numa < numb) ? ((pHigh = b) && (pLow = a)) : ((pHigh = a) && (pLow = b));
	
	for(i = low;i > 0;i--)
	{
		rst[high] += (pLow[i - 1] + pHigh[high - 1] - '0');
		high--;
		if(rst[high + 1] > '9')
		{
			rst[high + 1] -= 10;
			rst[high]++;
		}
	}
   /*    还有多的    */
	if(high == 1)
		goto last;
	
	for(i = high;i != 0;i--)
	{
		rst[i] += pHigh[i - 1];
		if(rst[i] > '9')
		{
			rst[i] -= 10;
			rst[i - 1]++;
		}
	}
	
	last:
		return (rst[0] == 1) ? (!(rst[0] = '1')) : 1;
}

??这里我们需要以位数的最大值为结果位数, 但是相加次数需要以位数少者为标准。考虑最高位可能进1, 因此这里是把rst[0]作为进位预备位。如果进位了偏移量则是0, 否则将会是1。你可以尝试 99999 + 1

减法部分

??减法部分需要考虑被减数与减数之间的大小, 才能决定怎么运算。因此这里是先比较大小以找出较大者, 然后再做运算时。同样也是从低到高进行运算, 然后处理结果。代码如下:

int bigNumSub(char rst[],char a[],char b[],int numa,int numb)
{
	int i,j,high,low;
    char *pHigh = NULL,*pLow = NULL;

	if(numa != numb)
	{
		(numa < numb) ? ((high = numb) & (low = numa)) : ((high = numa) & (low = numb));
		(numa < numb) ? ((pHigh = b) && (pLow = a)) : ((pHigh = a) && (pLow = b));
	}
	else
	{
		(strcmp(a,b) < 0) ? ((high = numb) & (low = numa)) : ((high = numa) & (low = numb));
		(strcmp(a,b) < 0) ? ((pHigh = b) && (pLow = a)) : ((pHigh = a) && (pLow = b));
	}

	j = high;
	for(i = low;i > 0;i--)
	{
		rst[j] = pHigh[j - 1] + '0' - pLow[i - 1];
		j--;
	}
	
	if(j > 0)
	{
		for(i = j;i > 0;i--)                                                                                                                                  
			rst[i] = pHigh[i - 1];
	}
	
	for(i = high;i > 1;i--)
	{
		if(rst[i] < '0')
		{
			rst[i] += 10;
			rst[i - 1]--;
		}
	}
 
	/*    找偏移量    */
	for(j = 1;j <= high;j++)
	{
		if(rst[j] == '0')
			continue;
	  else
     break;
	}

	if(numa < numb || (numa == numb && strcmp(a,b) < 0))
	{
		j--;
		rst[j] = '-';
	}

	return j;
}

??这里需要注意如果两个数位数不一样, 那么大小则很明显了。两者位数一样则需要使用strcmp函数获取结果(一直比较直到两个字符串某个字符不等), 这样确定了两个数的大小, 再依次做运算。j > 0则是表明两个数位数不一样, 然后寻找偏移量, 确定符号。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:25:37  更:2021-11-14 21:28:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:52:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码