C语言实现大数加法

在C语言中如果是两个能被某种类型保存的数字,就可以用加号实现两个数的相加。但是,两个数字超过了某种类型的保存范围就不能用简单的加法来求得两数之和。例如 int 类型

  • 符号范围 :-2,147,483,648 到 2,147,483,647
  • 无符号范围 :0 到 4,294,967,295

如果定义两个无符号的整形变量 a 和 b 。

1. 当 0<= a <=4294967295 并且 0<= b <= 4294967295时,就可以通过简单的 a+b 求得两数之和。

2 .当 a 和 b 中任意一个数大于 4294967295,或者两个数都大于 4294967295 时。我们就只能通过模拟加法计算的过程来实现两个数的相加。若何实现?我们用两个数组来保存数字 a 和 b ,在用一个新的数组 ans 保存计算的结果,并且每个数位依次保存在数组中。然后用一个变量 ret 保存某位对应的数字相加和。用进制对ret取余数 时则是对应位置相加的值,用进制对ret取整 则是两个数相加的进位值。例如 ret = 6+7,ret%10=3 是个位的值,ret/=10 后 ret=1是各位数字相加的进位值。

3. 对于数组 ans 来说,ans 要等于数字 a 数组和数字 b数组 的长度+1,以便有足够的空间保存计算的结果。

4. 对于数组的遍历一般与数字计算相同,从后往前 。当然 也可以 从前往后 ,这要根据自己如何保存两个数的方式来选择。例如 数字 123 通过取余方式 不断得到每一位,最后保存在数组为 3,2,1 那么就要从前往后遍历数组。并且把结果数组ans 进行逆序。我这里用的是从后往前计算。

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
int* addlargeNumbers(int* a, int numsizea, int* b, int numsizeb,int*returnsize)
{
	int maxlen = numsizea > numsizeb ? numsizea + 1 : numsizeb + 1;
	int* ans = (int*)malloc(4 * maxlen);
	int indexa = numsizea - 1;//只遍历数组 a
	int indexb = numsizeb - 1;//只遍历数组 b
	int indexans = maxlen - 1;只遍历数组 ans,用于保存答案
	*returnsize = maxlen;
	int ret = 0;  //保存每个数位之和
	while (indexa >= 0 || indexb >= 0||ret>0)
	{
		if (indexa >= 0)//数组不能越界
			ret += a[indexa--];
		if (indexb >= 0)//数组不能越界
			ret += b[indexb--];
		ans[indexans--] = ret % 10;//收集结果
		ret /= 10;//的到进位
	}
	//如果 indexans 指向下标,则最终结果没有产生进位。例如:4+9 不可能得到两位数字
    //所以要把每个下表的元素往前移一位
	if (indexans == 0)
	{
		*returnsize = maxlen - 1;
		for (int i = 0; i < maxlen - 1; i++)
			ans[i] = ans[i + 1];
	}
	return ans;
}
int main()
{
	int size = 0;
	int a[] = {1,2,3,4};//数字 1234
	int b[] = { 2,3,4};//数字 234
	int* ans = addlargeNumbers(a, sizeof(a) / 4, b, sizeof(b) / 4, &size);
	for (int i = 0; i < size; i++)
		printf("%d", ans[i]);
	return 0;
}
相关推荐
无糖可乐没有灵魂2 分钟前
用一篇文章来精通“进程/线程/协程/锁“多并发任务
开发语言·php
2601_962885722 分钟前
如何用 Python 分析股票的日历效应?(星期效应与月份效应,附数据挖掘陷阱)
开发语言·python·数据挖掘
“AI国潮设计-小江”14 分钟前
Python实战 | SDXL批量生成“带炸英歌”国潮IP:从海报到门店落地(附核心Prompt与授权思路)
开发语言·人工智能·python·prompt·aigc
字节渡客16 分钟前
PHP项目复盘:foreach 引用残留造成的诡异数据错乱
开发语言·php
我就是不信19 分钟前
深入理解 Python 虚拟机:字典(dict)的优化
开发语言·python·哈希算法
我就是不信23 分钟前
C语言排序问题详解:从冒泡到快排的完整指南
c语言·算法·排序算法
艾莉丝努力练剑25 分钟前
【QT】系统相关:多线程QThread基础
开发语言·网络·c++·qt·学习·大模型
ysu_031432 分钟前
uv实战指南-从Python版本虚拟环境到pyproject依赖管理
开发语言·python·pip·uv·虚拟环境·包管理·依赖管理
奇牙coding40 分钟前
Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型
java·c语言·数据库·ai