函式原型介紹:
[cpp]view plain
copy
// first和second:任意大小的十進位制字串整數,該函式主要解決超出int和long值域的大型整數加法運算
// first和second的取值範圍:可以是"99999999999999999"、"-9999999999999999999"和"0"等
// result:儲存相加的結果
void
add_large_integer(
const
char
* first,
const
char
* second,
char
* result);
實現原理介紹:整數相加問題可以歸結為兩個子問題,即」正整數相加和正整數相減「,相加需要考慮進製的情況,相減則考慮借位的情況,按照測試驅動開發的原則,寫上若干測試用例,如下所示:
[cpp]view plain
copy
#include
#include
using
namespace
std;
intmain(
intargc,
char
* ar**)
; // 用例1
add_large_integer("99999999999999999999"
, "99999999999999999999"
, result);
assert(0 == strcmp(result, "199999999999999999998"
));
// 用例2
result[0] = '\0'
; add_large_integer("-99999999999999999999"
, "6666666666666666666666666666666"
, result);
assert(0 == strcmp(result, "6666666666566666666666666666667"
));
return
0;
}
將要用到的輔助函式列表,原型如下:
[cpp]view plain
copy
// 跳過連續無效數字
const
char
* skip_serial_number(
const
char
* integer,
intnumber);
// 反轉字串
char
* reverse_string(
char
* p);
// 判斷是否正整數
bool
is_positive_integer(
const
char
* integer);
// 判斷是否負整數
bool
is_negative_integer(
const
char
* integer);
// 正整數相加
void
add_positive_integer(
const
char
* first,
const
char
* second,
char
* result);
// 正整數相減
void
minus_positive_integer(
const
char
* large,
const
char
* small,
char
* result);
函式實現:
[cpp]view plain
copy
// 大數相加演算法
void
add_large_integer(
const
char
* first,
const
char
* second,
char
* result)
// 兩個正整數相加
if( is_positive_integer(first) && is_positive_integer(second) )
// 兩個負整數相加
else
if( is_negative_integer(first) && is_negative_integer(second) )
// 正整數和負整數相加
else
else
else
// 負數的絕對值大於正數,相加後為負數
reverse_string(result); // 反轉result字串結果
} }
else
// first為正數,second為負數
} }
[cpp]view plain
copy
// 跳過連續無效數字
const
char
* skip_serial_number(
const
char
* integer,
intnumber)
return
integer;
}
[cpp]view plain
copy
// 反轉字串
char
* reverse_string(
char
* p)
return
p;
}
[cpp]view plain
copy
// 判斷是否正整數
bool
is_positive_integer(
const
char
* integer)
++integer;
} return
true
; }
[cpp]view plain
copy
// 判斷是否負整數
bool
is_negative_integer(
const
char
* integer)
return
false
; }
[cpp]view plain
copy
// 正整數相加
void
add_positive_integer(
const
char
* first,
const
char
* second,
char
* result)
// 計算三者的和以及進製
intfirst_value = *first ? (*first -
'0') : 0;
intsecond_value = *second ? (*second -
'0') : 0;
intresult_value = *result ? (*result -
'0') : 0;
intsum = first_value + second_value + result_value;
// 計算當前位的值
*result = (sum % 10) + '0'
; // 計算進製的值
if( sum >= 10 )
else
// 遞迴呼叫
first = *first ? ++first : first;
second = *second ? ++second : second;
add_positive_integer(first, second, ++result);
}
[cpp]view plain
copy
// 正整數相減
void
minus_positive_integer(
const
char
* large,
const
char
* small,
char
* result)
// 計算當前位的差值
intborrow_value = *result ? 1 : 0;
// 通過result儲存借位情況
intlarge_value = *large ? ((*large -
'0') - borrow_value) : 0;
intsmall_value = *small ? (*small -
'0') : 0;
if( large_value < small_value )
else
// 遞迴呼叫
small = *small ? ++small : small;
minus_positive_integer(++large, small, ++result);
}
leetcode 兩數相加(演算法)
兩數之和 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。看到題目我首先想到的是將目標值 target 拆分,將目標值變成0 target,1 target 1 target 2 target target 2 由於第一次做演...
大數相加的演算法
有次周五失眠,嘗試下了下大數相加的演算法。這個週末再優化下,先露露臉。include include include include using namespace std char num1 1030000000000910 char num2 10 int strlen1 strlen num1...
c 兩個陣列相加 演算法 如何實現大正整數相加?
題目 在不使用biginteger類的情況下,如何計算兩個大正整數的和?程式不可能通過一條指令計算出兩個大整數的和,但我們可以把乙個大運算拆分成多個小運算,像小學生一樣列豎式進行按位運算。這裡還有乙個問題,我們都知道long型別的取值範圍是 最小值 long.min value 9223372036...