题目:
示例1
输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
输入:num1 = "0", num2 = "0" 输出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1
和num2
都只包含数字0-9
num1
和num2
都不包含任何前导零
基本思路:首先注意到我们Leetcode上面的C语言代码书写界面
以下拿示例二举例:
上图绿色表示进位,红色表示每一位的数值。
我们用两个索引去利用NUM1和NUM2去指向字符串各个位的字符。
i索引到NUM1所指向字符串最高位,j指向字符串NUM2最低位时做计算(此处计算是单个字符-‘0’操作),得到低位和一位进位。其中低位+‘0’转化为字符存入内存中,进位则参与后续运算,然后i,j同时向左移动一位,将所指向的字符串的其中一位相加并加上刚才算出来的进位。以此类推,我们可以算出NUM1和NUM2所指向的字符串之和。
由上述流程可知,最后得到的结果是反转的,如示例二得到结果为“335”,此时需要写一个反转字符串的代码反转一下。
具体代码实现如下:
char * addStrings(char * num1, char * num2){
int a=strlen(num1)-1,b=strlen(num2)-1;
char* ch = (char*)malloc(sizeof(char) * (fmax(a, b) + 3));//fmax(a,b)表示取a,b两个最大的一个
int Intnum1=0,Intnum2=0,add=0;//Intnum1,Intnum2分别为num1和num2从低到高的一个字节位,add为进位
int len=0;//记录相加后的数位
while(a>=0||b>=0||add!=0){
Intnum1=a>=0?*(num1+a)-'0':0;
Intnum2=b>=0?*(num2+b)-'0':0;
int re=Intnum1+Intnum2+add;//单个字符相加的和(红色底的数字),add位进位
ch[len++]='0'+re%10;//将re的低位转化为字符存入ch[]
add=re/10;//去除低位,得到进位(绿色底的数字)
a--,b--;
}
//反转
for(int i=0;2*i<len;i++)
{
int t=ch[i];
ch[i]=ch[len-i-1],ch[len-i-1]=t;
}
ch[len++]='\0';
return ch;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务