超大数相加

前言

所谓超大数,就是整型int64字节装不下的值

而我们今天就是要实现一个64位以上的数相加,得出结果

思路

我的想法是把这个数以字符形式存到数组里

运算时再转换成int一位一位计算

得出结果再以字符形式输出

实践

先实现底层逻辑

int main()
{
	char bignum1[100] = { 0 };
	char bignum2[100] = { 0 };
	char bigsum[100] = { 0 };
	scanf("%s",&bignum1);
	scanf("%s",&bignum2);
	bignum_Add(bignum1,bignum2,bigsum);
	return 0;
}

先输入两个需要相加的值存放到bignum1和bignum2里

bigsum作为结果数组


	int count = 0;
	char* pb = bigsum;

 把bigsum第一位地址存入pb备用


接下来就是函数的实现

*因为在加法过程中可能会有要进位的情况出现,所以我决定从最后一位开始加

所以需要先让指针指向最后一个输入的数据

	while (*bignum1)
	{
		bignum1++;
	}
	while (*bignum2)
	{
		bignum2++;
		bigsum++;//
	}
	bignum1--;//因为经过while循环指针会指向输入数据的后一个元素
	bignum2--;//所以需要--调整指针

这样,指针就指向最后一个输入的数据了

*注:这里把结果数组bigsum地址也一起++,刚好就方便腾出空间放置结果

但后面bigsum没有--,是为了多腾出一个元素放置可能因为进位多出的第一位

(例:9+2=11,两个一位数相加可能得到两位数)


指针调整好,接下来就可以进行计算了

	int a = (*bignum1 - '0' + *bignum2 - '0');
	bigsum[0] = (a % 10) +count+ '0';

数字字符 - 字符'0'得到的结果刚好就是对应的数字,再计算得到的结果存入a

(a%10得到个位数),+前一位的进位,+字符'0'再转换为数字字符

存入bigsum指向的空间


计算完后,还要调整进位

	count = 0;
	if (a > 9)
		count = 1;

默认为0,如果a>9,给count赋1


因为有很多位数要计算,所以要放进循环里

这是循环的调整

		*bignum1 = '\0';
		*bignum2 = '\0';
		bignum1--;
		bignum2--;
		bigsum--;

*注:赋'\0'是因为对该位已经计算完了,赋'\0'用来结尾

不然指针向前挪动还会带着计算过得位数


当然,还要对第一位是否进位判断

		if (bigsum == pb)
		{
			if (count == 1)
			{
				*pb = '1';
			}
		break;
		}

如果bigsum == pb  即如果回到第一个元素的地址

判断pb是否进位

break跳出循环


最后打印

    printf("%s", bigsum);

结果代码

#include <stdio.h>
void bignum_Add(char* bignum1,char*bignum2,char*bigsum)
{
	int count = 0;
	char* pb = bigsum;
	while (*bignum1)
	{
		bignum1++;
	}
	while (*bignum2)
	{
		bignum2++;
		bigsum++;
	}
	bignum1--;//因为经过while循环指针会指向输入数据的后一个元素
	bignum2--;//所以需要--调整指针
	while (*bignum1 && *bignum2)
	{
		int a = (*bignum1 - '0' + *bignum2 - '0');
		bigsum[0] = (a % 10) +count+ '0';
		count = 0;
		if (a > 9)
			count = 1;
		*bignum1 = '\0';
		*bignum2 = '\0';
		bignum1--;
		bignum2--;
		bigsum--;
		if (bigsum == pb)
		{
			if (count == 1)
			{
				*pb = '1';
			}
		break;
		}
	}
	printf("%s", bigsum);
}

int main()
{
	char bignum1[100] = { 0 };
	char bignum2[100] = { 0 };
	char bigsum[100] = { 0 };
	scanf("%s",&bignum1);
	scanf("%s",&bignum2);
	bignum_Add(bignum1,bignum2,bigsum);
	return 0;
}

缺点

1.计算过程中会改变原来的数组

2.待计算数据中不能有0;不然会因为while停止循环,即只会计算0之前的数据

3.num2必须比num1位数多,不然会越界访问,因为bigsum是跟着num2一起动的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现两个大数相加,可以使用链表来存储这两个数。具体步骤如下: 1. 定义链表节点,包含一个值和指向下一个节点的指针。 ``` struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ``` 2. 将两个大数分别存储到两个链表中,每个节点存储一位数字。 ``` ListNode *num1 = new ListNode(0); ListNode *num2 = new ListNode(0); ListNode *p1 = num1, *p2 = num2; for (int i = 0; i < len1; i++) { p1->val = num1_str[len1 - 1 - i] - '0'; if (i != len1 - 1) { p1->next = new ListNode(0); p1 = p1->next; } } for (int i = 0; i < len2; i++) { p2->val = num2_str[len2 - 1 - i] - '0'; if (i != len2 - 1) { p2->next = new ListNode(0); p2 = p2->next; } } ``` 其中,`num1_str`和`num2_str`为两个大数的字符串表示,`len1`和`len2`为它们的长度。 3. 对两个链表进行遍历,依次相加每一位,并将结果存储到新的链表中。 ``` ListNode *result = new ListNode(0); ListNode *p = result; int carry = 0; while (num1 || num2) { int sum = carry; if (num1) { sum += num1->val; num1 = num1->next; } if (num2) { sum += num2->val; num2 = num2->next; } p->val = sum % 10; carry = sum / 10; if (num1 || num2 || carry) { p->next = new ListNode(0); p = p->next; } } if (carry) { p->val = carry; } ``` 4. 将新的链表反转,得到相加后的结果。 ``` ListNode *rev_result = NULL; while (result) { ListNode *next = result->next; result->next = rev_result; rev_result = result; result = next; } ``` 最终,`rev_result`就是两个大数相加的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值