您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页Leetcode---415.字符串相加(C语言)

Leetcode---415.字符串相加(C语言)

来源:化拓教育网

题目:

 示例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语言代码书写界面

以下拿示例二举例:

上图绿色表示进位,红色表示每一位的数值。

我们用两个索引去利用NUM1NUM2去指向字符串各个位的字符。

i索引到NUM1所指向字符串最高位,j指向字符串NUM2最低位时做计算此处计算是单个字符-‘0’操作,得到低位和一位进位。其中低位+‘0’转化为字符存入内存中,进位则参与后续运算,然后i,j同时向左移动一位,将所指向的字符串的其中一位相加并加上刚才算出来的进位。以此类推,我们可以算出NUM1NUM2所指向的字符串之和。

由上述流程可知,最后得到的结果是反转的,如示例二得到结果为“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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务