演算法用連結串列模擬大整數加法運算
例如:9->9->9->NULL
+ 1->NULL
1->0->0->0->NULL
思路:
使用遞迴,能夠實現從前往後計算。
- // LinkTable.cpp : 定義控制檯應用程式的入口點。
- //
- #include "stdafx.h"
-
#include
-
#include
- using namespace std;
- //連結串列的結構體
- struct node
- {
- char val;
- node * next;
- };
- //建立連結串列
- struct node * create( string & str_link )
- {
- int len = str_link.length();
- struct node * phead = new node(); //帶有表頭的連結串列,表頭中不儲存任何元素
- struct node * preNode = phead;
-
for( int i=0; i
- {
- struct node * pNode = new node();
- pNode->val = str_link[i];
- pNode->next = NULL;
- preNode->next = pNode;
- preNode = pNode;
- }
- return phead;
- }
- //輸出連結串列
- void out_link( struct node * phead )
- {
- if( phead == NULL )
- return;
- struct node * pNode = phead->next;
- while( pNode )
- {
-
cout <
val; - pNode = pNode->next;
- }
- cout <
- }
- //求無表頭連結串列的長度
- //返回-1為連結串列不存在
- int link_length( struct node* pNode )
- {
- if(!pNode) return -1;
- int len=0;
- while( pNode )
- {
- pNode = pNode->next;
- len++;
- }
- return len;
- }
- //大數相加遞迴演算法
- //pNode1, pNode2為兩個中間運算結點,但不是頭結點
- struct node * add( struct node * pNode1, struct node * pNode2, int & carry )
- {
- if( !pNode1 ) return pNode2;
- if( !pNode2 ) return pNode1;
- "white-space: pre;"> //為了引數簡潔,這裡增大了計算量,可以將連結串列長度作為引數傳進來
- int len1 = link_length( pNode1 );
- int len2 = link_length( pNode2 );
- if( len1 == len2 )
- {
- if( len1==1 ) //遞迴終止條件
- {
- struct node * pNode = new node();
- int sum = (pNode1->val - '0' ) + ( pNode2->val -'0');
- carry = sum/10;
- pNode->val = sum%10 + '0';
- pNode->next = NULL;
- return pNode;
- }
- else
- {
- int carry_cur=0;
- struct node * pNode = new node();
- struct node * pNext = add( pNode1->next, pNode2->next, carry_cur );
- int sum = (pNode1->val - '0' ) + ( pNode2->val -'0') + carry_cur;
- carry = sum/10;
- pNode->val = sum%10 + '0';
- pNode->next = pNext;
- return pNode;
- }
- }
- if( len1>len2 )
- {
- int carry_cur=0;
- struct node * pNode = new node();
- struct node * pNext = add( pNode1->next, pNode2, carry_cur );
- int sum = (pNode1->val - '0' ) + carry_cur;
- carry = sum/10;
- pNode->val = sum%10 + '0';
- pNode->next = pNext;
- return pNode;
- }
-
if( len1
- {
- int carry_cur=0;
- struct node * pNode = new node();
- struct node * pNext = add( pNode1, pNode2->next, carry_cur );
- int sum = (pNode2->val - '0' ) + carry_cur;
- carry = sum/10;
- pNode->val = sum%10 + '0';
- pNode->next = pNext;
- return pNode;
- }
- return NULL;
- }
- struct node * add( struct node * phead1, struct node * phead2 )
- {
- if( !phead1 || !phead1->next ) return phead2;
- if( !phead2 || !phead2->next ) return phead1;
- int carry = 0;
- struct node * pNode = add( phead1->next, phead2->next, carry );
- if( carry > 0 ) //有進位,則需要多一個結點
- {
- struct node * pCarry = new node();
- pCarry->val = '0' + carry;
- pCarry->next = pNode;
- pNode = pCarry;
- }
- struct node * phead = new node();
- phead->next = pNode;
- return phead;
- }
- void test()
- {
- string str;
-
cout <"Input the first link:"<
- cin >> str;
- struct node *phead1 = create( str );
-
cout <"Input the second link:"<
- cin >> str;
- struct node *phead2 = create( str );
- struct node * phead = add( phead1, phead2);
-
cout<"The result is:" <
- out_link( phead );
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- test();
- return 0;
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1142668/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LeetCode-2. 兩數相加(連結串列+大數加法模擬)LeetCode
- C++ std::list實現大整數加法運算C++
- 陣列模擬單連結串列陣列
- 面相物件(三):模擬連結串列物件
- C語言程式設計-長整數加法運算C語言程式設計
- 大數運算—大數加法、減法、乘法、除法詳解
- 模擬STL連結串列類的實現
- java大整數四則運算Java
- Numpy 加法運算,opencv 加法運算,影像的融合OpenCV
- C/C++模運算(正負整數)C++
- [CodeWars][JS]實現大整數加法JS
- 大整數運算C#實現C#
- 陣列模擬單連結串列你會了嗎?陣列
- day4 連結串列-模擬與快慢指標指標
- pta重排連結串列(一個很清晰的實現,完全模擬連結串列的實現)
- 連結串列還會用嗎?用連結串列實現棧(附演算法原始碼)演算法原始碼
- 使用位運算進行加法運算
- 演算法-連結串列演算法
- 連結串列還會用嗎?用連結串列實現佇列(附演算法原始碼)佇列演算法原始碼
- JS加法運算全解析JS
- 用連結串列的方式實現大數相減-Java實現Java
- 運算整數C/C++位運算技巧C++
- 把玩演算法 | 連結串列演算法
- 用陣列實現大數加法陣列
- 1290. 二進位制連結串列轉整數
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- JavaScript 浮點數及運算精度調整總結JavaScript
- 模冪運算-要求演算法返回冪運算a^b的計算結果與1337取模後的結果演算法
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- [藍橋杯][演算法提高VIP]大數加法演算法
- 演算法面試(一) 連結串列演算法面試
- 初級演算法-連結串列演算法
- 力扣--連結串列演算法力扣演算法
- 筆記--連結串列演算法筆記演算法
- 環形連結串列_相交連結串列_多數元素(java語言)Java
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 連結串列-雙向連結串列