两个超长正整数的加法

#include<stdio.h>
#include<string.h>
int main() {
	int n[100] = {0}, m[100] = {0};
	int k = 0, reward;
	char num1[100], num2[100];
	scanf("%s%s", num1, num2);
	reward = strlen(num1) > strlen(num2) ? strlen(num1) : strlen(num2);
	for (int i = strlen(num1) - 1; i >= 0; i--) {
		n[k++] = num1[i] - '0';
	}
	k = 0;
	for (int i = strlen(num2) - 1; i >= 0; i--) {
		m[k++] = num2[i] - '0';
	}
	if ((n[strlen(num1) - 2] + m[strlen(num2) - 2] > 9 && (n[reward - 1] == 9 || m[reward - 1] == 9)) ||
	        (strlen(num1) == strlen(num2) && n[strlen(num1) - 1] + m[strlen(num2) - 1] > 9)) {
		printf("1");
	}
	for (int i = 0; i < reward; i++) {
		n[i] = n[i] + m[i];//TODO
		if (n[i] > 9) {
			n[i] -= 10;//TODO
			n[i + 1]++;
		}
	}
	for (int i = reward - 1; i >= 0; i--) {
		printf("%d", n[i]);
	}
	return 0;
}
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111199999999999999999999999999999999999999999999999
11111111111111111111122222222222311111111111111111111111111111111111111111111110
--------------------------------
Process exited after 24.21 seconds with return value 0
请按任意键继续. . .

全是vip,老子自己发。当代白嫖怪,大学生新生表示不服。

续上:

新手思路,设定两对数组,整型(m,n)和 字符串(num1,num2)。

再,            进行倒序循环,通过“n[k++] = num1[i] - '0';”将得到的字符串转换为整型。

其中,        reward 计算最长字符节,方便进行以下行为:1111+1111999 转变为

1111000     对位相加,并通过判断是否大于9而决定是否进位,如果是则本位减十。(第三个for)

9991111 +

本文存在一个值得探讨的问题(当然这里解决了"第一个if"),关于最大对位进位问题:

90+10=100;89+11=100;

其中,09    (个位在左)是由十位引发的进位  98    是由个位引发的近位。

           01 +                                                         11 +

而这,是一个关键点,而我用了一个比较直接的方法。如果字符长度相同,那么计算其最大位相加是否大于九,或者计算reward的下一位相加是否大于9,如果是那么判断“reward位”是否存在9,这里字符长度相同的情况已经排除,也不用担心数位差距存在错误,因为倒序的过程中更高位数会被零补位,例如9+901=>900+109,并不会出现错误。

最后,             倒序输出(第四个for)。

至于对于最大对位进位的问题是否存在更优解后续在学习与成长的过程中我会不断的去思考。

接下来我会去思考关于两个长整数的乘法的解决方法,并把思路和解法(包括思考过程)叙述出来,乘法也更有挑战性,也更有兴趣。只谈兴趣与自由,有兴趣可以一起思考,成长与打发时光。(超长整数的加法不充vip搜不到)以后就发那些平时要写的作业但是难以搜到的。就当无聊打发时间了,我一定坚持。多思考,自己写,加油,此处非标准答案参上。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦落亦秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值