LeetCode之字符串相加(415)

題目:字符串相加

給定兩個字符串形式的非負整數num1和num2,計算它們的和:

注意:

1.num1和num2的長度都小於5100。

2.num1和num2都只包含數字0-9。

3.num1和num2都不包含任何前導零。

4.不能使用任何內奸BigInteger庫,也不能直接將輸入的字符串轉換爲整數形式。

 

題目分析

簡單的來說就是給定非負整數num1和num2,然後我們計算兩個數的和,並返回。這裏需要注意的是,num1和num2是字符串形式出現的,並且返回的數據也是需要返回字符串形式的。

例num1 = 13540, num2 = 15462。則傳入函數的字符串分別爲 “13540” 和 “15462” 。我們返回的結果是 “29002”。

這裏最常規的思維就是將傳入的字符串先轉換成兩個非負整數,然後進行計算,再將計算結果轉換成一個字符串返回,這裏我們需要考慮到數據溢出,以及效率的問題。假如數據長度爲5100位,我們就沒有合適的數據類型去存儲該變量。然後字符串轉非負整數,然後非負整數再去轉換成字符串,中間有還順序的問題,十分的複雜和易錯。

所以我們這邊採用的是,直接使用C語言模擬十進制的加法運算。首先兩個數據對齊,然後取相同位上的數據相加。若某個字符串該位爲空,直接補0,進行計算。

如下圖所例:

num1爲890341,num2爲16269。計算時,先將兩個數據尾對齊,然後再進行計算。

 

具體代碼

char * addStrings(char * num1, char * num2){

    if (NULL == num1)                                            //若某個字符串爲空,不需要進行計算,直接返回另一個字符串
        return num2;
    if (NULL == num2)
        return num1;

    int len1 = strlen(num1);                                    //計算兩個字符串的長度
    int len2 = strlen(num2);
    
    unsigned char data1 = 0;
    unsigned char data2 = 0;
    unsigned char carry = 0;

    int len = (len1 > len2) ? (len1) : (len2);                

    char *res = (char *)malloc(sizeof(char) * (len + 2));       //長度+2  一個用於進位預留,一個存放結束符
    memset(res, 0 ,sizeof(char) * (len + 2));
    res[++len] = '\0';                                          //結束符

    while (len > 1 || carry == 1)                               //len>1是還有數據沒進行相加,c爲1則是有進位
    {
		
        data1 = (len1 > 0) ? (num1[--len1] - '0') : (0);        //字符串該位有數據則取數據,沒數據則補0進行計算  
                                                                //記得將字符轉換成整數進行計算
        data2 = (len2 > 0) ? (num2[--len2] - '0') : (0);
		
        data1 = data1 + data2 + carry;

        if (data1 > 9)                                          //數據有進位
        {
            data1 = data1 % 10;
            carry = 1;
        }
        else carry = 0;
		
        res[--len] = data1 + '0';
		
    } 

    return res + len;                                           //謹記要加上len,假如兩個字符串相加沒進位
                                                                //直接返回時,第一個元素爲0,錯誤
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章