持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
一、题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
- 1 <= num1.length, num2.length <= 10^4
- num1 和num2 都只包含数字 0-9
- num1 和num2 都不包含任何前导零
二、思路分析:
- 先malloc一个最大数组空间+2(一个用来存'\0',一个用来存最后的进位,如果不存在返回值++就好了)
- 定义一个进位值(i)和两个数之和的值(sum)
- 从字符串最后开始遍历,一个指针指向第一个字符串,另外一个指向第二个数组,遍历一次将指针相加进位保存在i中,个位保存在sum (注意所有定义的都是int型,但是操作的都是字符串,注意转换)
- 最后在最后一位加'\0',如果有进位就在第一位
三、AC 代码:
char * addStrings(char * num1, char * num2){
int num1_len = strlen(num1);
int num2_len = strlen(num2);
int len_1 = num1_len-1;
int len_2 = num2_len-1;
int max_len = num1_len>num2_len ? num1_len : num2_len;
//第一步
char * num = malloc(sizeof(char) * (max_len+2));
//第二步
int i =0,sum = 0,max = max_len+2;
//第三步
while(len_1>=0&&len_2>=0)
{
sum = (num1[len_1--]-'0')+(num2[len_2--]-'0')+i;
i = sum/10;
sum = sum%10;
num[max_len--] = sum+'0';
}
while(len_1>=0)
{
sum = (num1[len_1--]-'0')+i;
i = sum/10;
sum = sum%10;
num[max_len--] = sum+'0';
}
while(len_2>=0)
{
sum = (num2[len_2--]-'0')+i;
i = sum/10;
sum = sum%10;
num[max_len--] = sum+'0';
}
//第四步
if(i>0)
{
num[0] = i+'0';
num[max-1] ='\0';
return num;
}
num[max-1] ='\0';
return ++num;
}