C語言程式設計-長整數加法運算

cnnbull發表於2021-09-09

課程設計題目及要求:長整數加法運算

【問題描述】

設計一個實現任意長的整數進行加法運算的演示程式。

【基本要求】

利用雙向迴圈連結串列實現長整數的儲存,每個結點含一個整型變數。任何整型變數的範圍是-(215-l)~(215-1) 。輸入和輸出形式:按中國對於長整數的表示習慣,每四位一組,組間用逗號隔開。

【測試資料】

(1) 0;0; 應輸出 “0” 。

(2)-2345,6789; -7654,3211; 應輸出 “-1,0000,0000” 。

(3)-9999,9999;1,0000,0000,0000; 應輸出 “9999,0000,0001” 。

(4) 1,0001,0001;-1,0001,0001; 應輸出 “0” 。

(5) 1,0001,0001;-1,0001,0000; 應輸出 “1” 。

(6) -9999,9999,9999;-9999,9999,9999;應輸出 “-1,9999,9999,9998” 。 (7) 1,0000,9999,9999;1; 應輸出 "1,0001,0000,0000 " 。

【實現提示】

(1) 每個結點中可以存放的最大整數為 215-1=32767, 才能保證兩數相加不會溢位。但若這樣存放,即相當於按32768進位制數存放,在十進位制數與32768進位制數之間的轉換十分不方便。故可以在每個結點中僅存十進位制數的4位,即不超過9999的非負整數,整個連結串列表示為萬進位制數。

(2) 可以利用頭結點資料域的符號代表長整數的符號。相加過程中不要破壞兩個運算元連結串列。不能給長整數位數規定上限。

(3)實現長整數的四則運算;

【選作內容】

(1)實現長整數的乘方和階乘運算;

(2)整型量範圍是- (2n-1) ~ (2n-1), 其中,n是由程式讀人的參量。輸入資料的分

組方法可以另行規定

系統功能和原始資料

1.原始資料

(1) 0;0; 應輸出 “0” 。

(2)-2345,6789; -7654,3211; 應輸出 “-1,0000,0000” 。

(3)-9999,9999;1,0000,0000,0000; 應輸出 “9999,0000,0001” 。

(4) 1,0001,0001;-1,0001,0001; 應輸出 “0” 。

(5) 1,0001,0001;-1,0001,0000; 應輸出 “1” 。

(6) -9999,9999,9999;-9999,9999,9999;應輸出 “-1,9999,9999,9998” 。

(7) 1,0000,9999,9999;1; 應輸出 "1,0001,0000,0000 " 。

2.系統功能

用連結串列來實現任意長度的長整數的加法

程式總體設計

(1)資料結構

採用雙向連結串列

(2)模組劃分和層次結構

十一個函式,main函式在開頭;

呼叫每個函式;

(3)函式原型清單

1.int Compare(dnode *a, dnode *b) ;

功能:用來比較連結串列中存入的兩個數的大小

2.void InitNode(dnode **head);

功能: 初始化連結串列

3.int InitNumber(dnode *head, char *data) ;

功能:將字元轉化為數字後,插入數字

4.void InsertNode(dnode *head, int x);

功能: 建立插入節點

5.void InsertNodePre(dnode **head, int x);

功能: 相加後,將結果插入已有節點的前面

6.void Addition(dnode *a, dnode *b) ;

功能: 相加

7.dnode* add(dnode *a, dnode *b) ;

功能: 進行相加,結果存入連結串列中,返回頭指標

8.dnode* sub(dnode *a, dnode *b) ;

功能: 進行相減,結果存入連結串列中,返回頭指標

9 void des( dnode *head);

功能:銷燬連結串列,釋放記憶體;

9.void PrintNode(dnode *head);

功能: 輸出連結串列

(4)程式總體框架

圖片描述

功能模組函式設計和除錯

主要模組:

加法:dnode* add(dnode *a, dnode *b)

功能:實現兩個同號的長整數相加;每個相加後的節點存入建立的新連結串列;

要考慮到進位,滿10000進一,每次計算時要注意加上進位的數值;

num = x + y + jin;//兩個相加,在加上進位的;

jin = num /10000;//因為是萬進位制,所以滿萬進一;

num = num%10000;;

if(jin > 0)//如果從後往前最後一位相加後,有進位的話,

InsertNodePre(&head, jin);

減法:dnode* sub(dnode *a, dnode *b)

功能: 這個函式用來 實現兩個異號的長整數相減;每個相加後的節點存入建立的新連結串列中;

要考慮到借位,每次相減要減去借位的數值

num = x - y - borrow;//減去借位的

borrow = 0;//初始化變數

if(num

borrow = 1;

num =num + 10000 ;

}

程式清單:

原始碼:

圖片描述

執行結果:

圖片描述

錯誤提示:非法字元:

圖片描述

課程設計總結

透過課設,對連結串列的理解更深一些,對於連結串列的新增,刪除和插入都更熟悉;

在檢查程式的時候,除錯的時候發現在迴圈一遍後,有些變數忘記重新初始化;

在查錯的時候,輸入非法字元程式會崩潰,進行控制判斷後,可以輸出錯誤資訊提示;

參考資料: 李戈影片. 錢能教材

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2524/viewspace-2797529/,如需轉載,請註明出處,否則將追究法律責任。

相關文章