字符串相加,给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* 将两个字符串形式的非负整数相加,并返回结果字符串。
*
* @param num1 第一个整数的字符串表示
* @param num2 第二个整数的字符串表示
* @return 新分配的字符串,表示两个整数的和
*/
char* addStrings(char* num1, char* num2)
{
int len1 = strlen(num1); // num1的长度
int len2 = strlen(num2); // num2的长度
int maxLen = len1 > len2 ? len1 : len2; // 取两个字符串长度的较大值
// 申请足够的空间,加1是为了存储字符串结束符'\0',再加1是为了可能的进位
char* result = (char*)malloc((maxLen + 2) * sizeof(char));
if (!result)
{
perror("Memory allocation failed");
exit(EXIT_FAILURE);
}
result[maxLen + 1] = '\0'; // 初始化字符串结束符
int i = len1 - 1;
int j = len2 - 1;
int k = maxLen; // result的索引,从最高位开始
int carry = 0; // 初始化进位为0
// 相加循环,直到两个字符串都处理完,或者出现进位
while (i >= 0 || j >= 0 || carry > 0)
{
int digit1 = i >= 0 ? num1[i--] - '0' : 0; // num1的当前位,如果i<0则为0
int digit2 = j >= 0 ? num2[j--] - '0' : 0; // num2的当前位,如果j<0则为0
int sum = digit1 + digit2 + carry; // 当前位的和加上进位
result[k--] = (sum % 10) + '0'; // 计算当前位的数字,并存储到result
carry = sum / 10; // 更新进位
}
// 如果result[0]是'0',说明有前导零,需要去掉
return result[0] == '0' ? &result[1] : result;
}
int main()
{
char num1[] = "123";
char num2[] = "456";
char* sum = addStrings(num1, num2);
printf("The sum of '%s' and '%s' is: %s\n", num1, num2, sum);
free(sum); // 释放之前动态分配的内存
return 0;
}
标签:num1,num2,int,整数,char,字符串
From: https://www.cnblogs.com/lwj294/p/18370169