题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
算法分析:
设置i,j指针分别指向num1,num2的末尾元素,模拟加法
- 首先是计算是否有进位,count=tmp/10,表示进几位。
- 添加当前为,计算tmp=a+b+count;.并将此时的位tmp%10添加到res的头部
- 当指针i或者j走过数字首部以后,给n1,或者n2赋值为0,就是为数字较短的那部分前面填充0.
- 最后遍历结束num1,num2跳出循环,根据count的值决定是否在头部添加进位1,最终返回res就可以了。
java代码实现:
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder res=new StringBuilder("");
int len1=num1.length();
int len2=num2.length();
int i=len1-1;
int j=len2-1;
int count=0;
while(i>=0||j>=0)
{
int a=(i>=0? num1.charAt(i)-'0': 0);
int b=(j>=0? num2.charAt(j)-'0':0);
int sum=a+b+count;
count=sum/10;
res.append(sum%10);
i--;
j--;
}
if(count>0)//可以自己画一下
res.append(1);
return res.reverse().toString();
}
}
C语言实现
C语言实现过程中也遇到一些问题
- 要注意char和int之间的转型
- 遇到报错leetcode报错:45ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x000 ,该错误的原因是在程序运行的过程中,导致数组的访问越界,一开始是因为我写成了res=(char*)malloc(sizeof(char)*(len1+5));导致的错误
- c语言中的字符串是以字符数组存储的,一般在末尾都会有一个结束标志’\0’,在自己定义一个字符数组的时候,如果要表示为字符串,应该这样写:
char num1[]={‘9’,’\0’};
- 返回res指针的时候,需要在res的末尾添加’\0’,表示字符串结束符。
char * addStrings(char * num1, char * num2){
char * res;
int k;
int len;
int len1=strlen(num1);
int len2=strlen(num2);
if(len1>=len2)
len=len1;
else
len=len2;
res=(char*)malloc(sizeof(char)*(len+5));
k=len;
res[0]='0';
res[k+1]='\0';
int count=0;
int sum=0;
len1=len1-1;
len2=len2-1;
while(len1>=0||len2>=0)
{
int a=(len1>=0? num1[len1]-'0':0);
int b=(len2>=0? num2[len2]-'0':0);
int sum=a+b+count;
count=sum/10;
res[k--]=(char)(sum%10+'0');
len1--;
len2--;
}
if(count==1)
res[k]=(char)(res[k]+1);
if(res[0]!='0')
return res;
else
{
res++;
return res;
}
}