C C 「大數相加演算法」

2021-09-30 11:29:06 字數 4896 閱讀 3687

函式原型介紹:

[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...