題目:字符串相加
給定兩個字符串形式的非負整數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,錯誤
}