自定义大数相加函数

注意一点,len=X-1

#define X 1000
void summation(char *num1, char *num2)
{
	int len1 = strlen(num1), len2 = strlen(num2), len = X - 1;
	char result[X] = { 0 };

	for (int i = 0; i < len; i++)
	{
		int n1 = (i < len1 ? num1[len1 - i - 1] - '0' : 0);
		int n2 = (i < len2 ? num2[len2 - i - 1] - '0' : 0);
		int n = n1 + n2;
		result[len - i - 1] += n;
		result[len - i - 2] += result[len - i - 1] / 10;
		result[len - i - 1] %= 10;
	}
	for (int i = 0; i < len; i++)
		result[i] += '0';

	for(int i=0;i<len;i++)
		if (result[i] != 0 && result[i] != '0')
		{
			puts(result + i);
		}
}
在 C 语言中处理大数相加、减或乘通常涉及到动态内存管理和位操作,因为 C 本身并没有内置数据类型直接支持任意大小的整数。你可以通过以下步骤实现: 1. **数组表示法**: - 使用固定长度的数组存储每一位,例如,可以使用 `long long` 或者自定义的结构体来存储每一位数字。 2. **转换输入**: - 把输入的字符串按照从低位到高位的顺序拆分成字符数组,然后逐个转换成相应的整数值。 3. **计算过程**: - 对于加法和减法,可以采用类似于学校手算法的方式,从低位开始逐位相加(或相减),如果结果超过 `long long` 的最大值,则需要进位到下一位。 - 对于乘法,也可以按位相乘,但是更复杂一些,需要考虑进位,并且可能会用到临时变量和数组来储存中间结果。 4. **进位处理**: - 当某一位相加(或相乘)的结果大于等于10(或100等对于多位数的情况),需要将该位置的进位添加到下一位。 5. **处理符号**: - 如果涉及负数,记得要额外记录符号,并在最后处理整个数的正负。 6. **结果输出**: - 将计算后的数组逆序拼接成字符串作为最终的结果。 下面是简单的示例代码片段,仅展示加法的基本思路: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DIGITS 20 typedef struct { int digits[MAX_DIGITS]; int sign; // 0 for positive, 1 for negative } BigNum; BigNum add(BigNum a, BigNum b) { BigNum result; int carry = 0, i = MAX_DIGITS - 1; result.sign = (a.sign ^ b.sign); // Set the sign of the result while (i >= 0 || carry != 0) { int sum = a.digits[i] + b.digits[i] + carry; carry = sum / 10; // Save carry for next position result.digits[i] = sum % 10; // Store current digit i--; } return result; } // ...其他函数如减法、乘法同理,这里不再赘述 int main() { char str1[], str2[] = "999999999999999999"; // Large numbers as strings BigNum num1, num2, res; // Convert strings to BigNums ... res = add(num1, num2); printf("Result: "); for (i = 0; i < MAX_DIGITS; i++) { if (res.digits[i] == 0 && i > 0) break; // Output only non-zero digits printf("%d", res.digits[i]); } return 0; } ``` 请注意这只是一个基本的示例,实际应用中可能需要更多的错误检查和优化。此外,对于乘法和其他复杂的数学运算,你可能需要借助第三方库,如 GMP(GNU Multiple Precision Arithmetic Library)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值