數(shù)據(jù)結(jié)構(gòu)課程設(shè)計長的整數(shù)加法_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計長的整數(shù)加法_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計長的整數(shù)加法_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計長的整數(shù)加法_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計長的整數(shù)加法_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、哈本淇打工上尊數(shù)據(jù)結(jié)構(gòu)課程設(shè)計題目名稱:長的整數(shù)加法計算機科學(xué)與技術(shù)學(xué)院一、 需 求分析1. 問題描述:設(shè)計一個程序?qū)崿F(xiàn)兩個任意長的整數(shù)的求和運算。2. 基本要求:利用雙向循環(huán)鏈表,設(shè)計一個實現(xiàn)任意長的整數(shù)進行加法運算的演示程序。要求輸入和輸出每四位一組,組間用逗號隔開。如: 1, 0000, 0000, 0000, 0000。3. 任務(wù)陳述:(a) 輸入的形式和輸入值的范圍:本實驗中演示中,長整數(shù)的每位上的數(shù)字必須為數(shù)字0 9 之間, 長整數(shù)的位數(shù)要求無限長。測試的時候輸入數(shù)據(jù),當(dāng)輸入回車鍵的時候結(jié)束輸入,如果輸入的字符不符合題目要求,則程序能過濾這些不符合要求的字符。(b) 輸出的形式:

2、整數(shù)的范圍無限制,可為正數(shù),可為負數(shù)。按照中國對于長整數(shù)的表示習(xí)慣,每四位是一組,組間用逗號隔開。(c) 程序所能達到的功能: 演示程序以用戶和計算機的對話方式執(zhí)行,即在計算機顯示 “提示信息”后之后, 由用戶在鍵盤上輸入演示程序中規(guī)定的運算命令;相應(yīng)的輸入數(shù)據(jù)和運算結(jié)果顯示在其后,并對錯誤。(d)測試數(shù)據(jù):一為正確輸入數(shù)據(jù),為錯誤輸入數(shù)據(jù)(超出4位), 為錯誤輸入數(shù)據(jù)(不足 4位 )。兩長整數(shù)a=b=0請按照如下形式輸入第一個長整數(shù),每四位一組: -1234,1234,1234 按該模式輸入0 輸入長整數(shù)a您的輸入結(jié)果為:0 顯示 a( 防止錯誤輸入)請按照如下形式輸入第一個長整數(shù),每四位一

3、組: -1234,1234,1234 輸入長整數(shù)b您的運算結(jié)果為:0 輸出b>a>0: -1234,1234,1234請按照如下形式輸入第一個長整數(shù),每四位一組1,1111,1111,1111您的輸入結(jié)果為: 1,1111,1111,1111請按照如下形式輸入第二個長整數(shù),每四位一組: -1234,1234,12349,9999,9999,9999您的輸入結(jié)果為: 9,9999,9999,9999您的運算結(jié)果為:11,1111,1111,1110a>b>0: -1234,1234,1234請按照如下形式輸入第一個長整數(shù),每四位一組9999,9999,9999您的輸入結(jié)果

4、為:9999,9999,9999: -1234,1234,1234請按照如下形式輸入第二個長整數(shù),每四位一組您的輸入結(jié)果為:您的運算結(jié)果為:1,0000,0000,0001 b<a<0請按照如下形式輸入第一個長整數(shù),每四位一組-2345,6789您的輸入結(jié)果為:-2345,6789請按照如下形式輸入第二個長整數(shù),每四位一組-7654,3211您的輸入結(jié)果為:-7654,3211您的運算結(jié)果為: 1,0000,0000 a<0,b>0,|a|>|b|請按照如下形式輸入第一個長整數(shù),每四位一組-1,0000,00001您的輸入結(jié)果為:-1,0000,0001請按照如下

5、形式輸入第二個長整數(shù),每四位一組2您的輸入結(jié)果為:2您的運算結(jié)果為:-9999,9999 a<0,b>0,|a|<|b|請按照如下形式輸入第一個長整數(shù),每四位一組: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234-9999您的輸入結(jié)果為:-9999請按照如下形式輸入第二個長整數(shù),每四位一組1,0000您的輸入結(jié)果為:1,0000您的運算結(jié)果為:1 a>0,b<0,|a|>|b|請按照如下形式輸入第二個長整數(shù),每四位一組1,0000,0000

6、您的輸入結(jié)果為:1,0000,0000請按照如下形式輸入第二個長整數(shù),每四位一組-9999您的輸入結(jié)果為:-9999您的運算結(jié)果為:9999,0001 a>0,b<0,|a|<|b|請按照如下形式輸入第一個長整數(shù),每四位一組1您的輸入結(jié)果為: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,12341請按照如下形式輸入第二個長整數(shù),每四位一組: -1234,1234,1234-1,0000,0000您的輸入結(jié)果為:-1,0000,0000您的運算結(jié)果為:-9999,9999錯誤輸入(例:輸入超過四位,

7、則自動取其前四位進行運算)請按照如下形式輸入第一個長整數(shù),每四位一組: -1234,1234,12341,00000您的輸入結(jié)果為:1,0000請按照如下形式輸入第二個長整數(shù),每四位一組: -1234,1234,1234-99998,01234您的輸入結(jié)果為:-9999,1234您的運算結(jié)果為:-9998,1234錯誤輸入(例: 非第一次輸入少于四位,則在輸入前加0 補足四位進行運算)請按照如下形式輸入第一個長整數(shù),每四位一組: -1234,1234,12341,000您的輸入結(jié)果為:1,0000請按照如下形式輸入第二個長整數(shù),每四位一組: -1234,1234,1234-1,11您的輸入結(jié)果

8、為:-1,0011您的運算結(jié)果為:-11二、概要設(shè)計1. 目標(biāo)需求與設(shè)計思想通過尾插輸入長整數(shù),為實現(xiàn)順序存入,并用頭插存儲的運算后的長整數(shù),因為運算必定從后向前計算,同樣為了實現(xiàn)順序存入。因為任意的長整數(shù)可能為負數(shù),則第一步需判斷其符號。先判斷長整數(shù)a,b 的符號的異同,相同,則將a 的符號存入新的雙向鏈表c 的符號位;相異,則將b的符號存入c,之后再處理。根據(jù) c 的符號位,使用加法或減法的函數(shù),需要考慮進位借位,從后開始進行運算。通過刪除函數(shù),刪除因借位而出現(xiàn)的多余的0。最后打印運算后的c。2 數(shù)據(jù)結(jié)構(gòu)此實驗采用的數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表。這樣可以很容易的找到他的前驅(qū)以及它的后繼,并使用它

9、們存儲。這是其結(jié)構(gòu)體聲明:typedef struct DualNodeint data;struct DualNode *prior, *next;DualNode, *DualList;2. 程序構(gòu)成1) DualList InputData()操作結(jié)果:初始化一雙向循環(huán)鏈表,完成輸入操作,并將該鏈表返回。2) DualList AddList(DualList a, DualList b)操作結(jié)果:判斷其符號3) DualList InitList(int sign)操作結(jié)果:初始化一雙向循環(huán)鏈表,存儲符號位,并將該鏈表返回4) void InsertNodeAtTail(DualLis

10、t L, int data)操作結(jié)果:尾插,用于存儲數(shù)據(jù)的存入。5) void InsertNodeAtHead(DualList L, int data)操作結(jié)果:插在頭結(jié)點之后,用于計算結(jié)果的存儲。6) void Add(DualList a, DualList b, DualList c)操作結(jié)果:加運算7) void Sub(DualList a, DualList b, DualList c)操作結(jié)果:減運算8) void DelNode(DualList L, DualNode *p)操作結(jié)果:刪除因借位產(chǎn)生的多余的009) void PrintList(DualList L)操作

11、結(jié)果:打印鏈表10) 程及調(diào)用關(guān)系主程序模塊輸入a輸入b率 調(diào)用 InputData()PrintList()調(diào)用AddList()InitList()調(diào)用DelNode()PrintList()結(jié)束三、詳細設(shè)計1. 頭文件定義#include <stdio.h>#include <stdlib.h>#include <ctype.h>2. 數(shù)據(jù)結(jié)構(gòu)詳細設(shè)計typedef struct DualNodeint data;struct DualNode *prior, *next;DualNode, *DualList;雙向循環(huán)鏈表的節(jié)點由三個部分組成,第一是

12、數(shù)據(jù)部分data 存儲此節(jié)點的數(shù)據(jù),第二是此節(jié)點的前驅(qū)指針部分*prior 指向此節(jié)點的前驅(qū),第三是此節(jié)點的后繼指針部分*next 指向此節(jié)點的后繼。數(shù)據(jù)部分我們約定它為整形變量,前驅(qū)后繼指針均為結(jié)構(gòu)體DualNode類型。3. 輸入函數(shù)與初始化函數(shù)設(shè)計DualList InputData()int FirstNum = 1, data;char c;DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;printf("Please Input as Format: -1234,12

13、34,1234n");if (c = getchar() = '-')L = InitList(-1);elseL = InitList(1);if (isdigit(c) /判斷是否為10進制數(shù)/ 退格處理ungetc(c, stdin);doscanf("%d", &data);while(data>9999) data=data/10;InsertNodeAtTail(L, data);while(c = getchar() != 'n');printf("Your Input is:n");

14、PrintList(L);return L;該函數(shù)在其內(nèi)創(chuàng)建了一個雙向函數(shù)鏈表,通過返回該鏈表完成初始化,減少函數(shù)個數(shù),降低復(fù)雜度。L = (DualList)malloc(sizeof(DualNode) 為開辟存儲空間, L->next = L->prior = L 將其前驅(qū)、后繼都指向L, 構(gòu)成循環(huán)。調(diào)用的函數(shù)InitList() 是為了在頭結(jié)點存放符號。ungetc() 的使用, 是因為將本該輸入?yún)s被取出的數(shù)返回到輸入流中去,以便正常輸入。do-while 語句是為了當(dāng)輸入回車時,能夠停止。while(data>9999) data=data/10該句是為了當(dāng)輸入錯誤

15、,超過 4 位時,取前四位當(dāng)做正常輸入存儲。PrintList(L) 打印存儲的鏈表,以便觀察輸入的長整數(shù)是否符合預(yù)期,并在該函數(shù)中,解決當(dāng)輸入小于4 位的錯誤的情況,在前補0 存儲。4. 符號位的存放DualList InitList(int sign)/ 頭結(jié)點存放符號位,1 為正, -1 為負DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;L->data = sign;return L;建立一個雙向循環(huán)鏈表,并將其返回。在頭結(jié)點存儲其符號位,1 為正, -1為負。5. 符號位

16、的初步判斷DualList AddList(DualList a, DualList b) /判斷符號DualList c;if (a->data * b->data > 0)c = InitList(a->data);Add(a, b, c);elsec=InitList(b->data);Sub(a, b, c);return c;當(dāng) a, b 符號相乘大于0 時,即相同時,運算后c 的符號一定等于a 的符號,執(zhí)行 Add() 函數(shù)。當(dāng) a, b 符號相乘小于0 時, 即相異時,運算后 c 的符號不一定等于b 的符號。因為間 可能大于|b| ,則需在Sub()

17、函數(shù),進一步進行判斷。6. 尾插用于輸入數(shù)據(jù)的存儲/ 尾插,用于存儲數(shù)據(jù)的輸入DualNode *s;s = (DualList)malloc(sizeof(DualNode);s->data = data;s->next = L;s->prior = L->prior;L->prior->next = s;L->prior = s;例如:輸入1,2345先是 1 被存入一個新的結(jié)點,在插入L 的末尾,之后2345 再存入結(jié)點,插入末尾,如此一來,方便數(shù)據(jù)的調(diào)用。7. 頭插用于運算后數(shù)據(jù)的存儲void InsertNodeAtHead(DualList

18、 L, int data)/ 即插在頭結(jié)點之后,用于計算結(jié)果的存儲DualNode *s;s = (DualList)malloc(sizeof(DualNode);s->data = data;s->next = L->next;s->prior = L;L->next->prior = s;L->next = s;例如: a=1234,5678 b=1,0001 。在本程序中,無論加減運算都從最后四位向前運算,則在頭結(jié)點后存儲,即為順序存儲,符合人的思維邏輯。即先在頭結(jié)點存入5679, 再在頭結(jié)點后存入1235,這樣存儲著為:1235,5679。8

19、. 打印void PrintList(DualList L)/ 打印int FirstTime = 1;DualNode *p = L;if (p->data = -1&&p->next->data!=0) printf("-");p = p->next;while(p != L)if (FirstTime)FirstTime = 0;printf("%d", p->data);elseprintf(",%04d", p->data);p = p->next;printf(&q

20、uot;n");if (p->data = -1&&p->next->data!=0) printf("-")首先判斷頭結(jié)點的符號并將其輸出。FirstTime 的作用是判斷是否為前四位,當(dāng) FirstTime=0 時, 則需要在前輸出逗號。在本函數(shù)中,printf(",%04d", p->data)解決了當(dāng)輸入小于4 位時的輸入錯誤,通過在前補0 的方法。9. 加預(yù)算void Add(DualList a, DualList b, DualList c)DualList pa, pb;int carry

21、 = 0, tmp;pa = a->prior;pb = b->prior;while(pa != a) && (pb != b)tmp = pa->data + pb->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pa != a)/ pb = btmp = pa->data + carry;if (tmp >= 1

22、0000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;while(pb != b)/ pa = atmp = pb->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pb = pb->prior;if (carry != 0)InsertNodeAtHead(c, 1);本函數(shù)主要由3 個 while 語句和一個if 語句構(gòu)成。

23、首先 int carry = 0, tmp; carry 代表著進位,開始為0。 tmp 為存儲運行中的結(jié)果。pa = a->prior;pb = b->prior;因為a, b 為雙向循環(huán)鏈表,pa, pb 指向其前驅(qū),則為a, b 的末尾。例如: a=1,1111 b=2,2222 此時 pa->data=1111,pb->data=2222, 符合運算順 序。第一個 while 語句:while(pa != a) && (pb != b)這是用來將a, b 從后開始相同長度的結(jié)點數(shù)據(jù)進行運算。tmp = pa->data + pb->d

24、ata + carry; 考慮進位的正常加法if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;當(dāng)運算結(jié)果大于等于10000時, 進位 carry=1 , 因為進位,運算結(jié)果減-10000。否則進位為0。InsertNodeAtHead(c, tmp); 將運算結(jié)果插入到c 的頭結(jié)點后。pa = pa->prior; pb = pb->prior;前移第二個 while 語句:while(pa != a) 則說明a的長度大于等于b,這是需將a剩余的結(jié)點導(dǎo)入c 中,需要考慮進位。第三個 while 語句:while(pa

25、!= a) 則說明b的長度大于a,這是需將b剩余的結(jié)點導(dǎo)入c中,需要考慮進位。If 語句當(dāng) a,b 中的數(shù)據(jù)結(jié)點都運算后,還存在進位,則需要在c 的頭結(jié)點插入1。10. 減運算void Sub(DualList a, DualList b, DualList c)DualList pa, pb, pc;int borrow = 0,tmp;pa = a->prior;pb = b->prior;while(pa != a) && (pb != b)/判斷a>b還是a<bif (pa->data >= pb->data + borrow)

26、borrow = 0;elseborrow = 1;pa = pa->prior;pb = pb->prior;)if (pa != a | (pa = a && pb = b && borrow = 0) /判斷 a>b還是a<b(/ a >= bc->data = a->data;)pa = a->prior;pb = b->prior;if(c->data!=b->data) /a>b情況borrow=0;while(pa != a) && (pb != b)/將 b

27、中與 a 等大的相減導(dǎo)入cif (pa->data >= pb->data + borrow) /不存在借位tmp = pa->data - pb->data - borrow;borrow = 0;elsetmp = 10000 + pa->data - pb->data - borrow;borrow = 1;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;把 a 中剩余導(dǎo)入cwhile(pa != a)/if (pa->data >= borrow)tmp =

28、pa->data - borrow;borrow = 0;elsetmp = 10000 - pa->data - borrow;borrow = 1;InsertNodeAtHead(c, tmp);pa = pa->prior;else/c<bc->data=b->data;borrow=0;將 a 中與 b 等大導(dǎo)入cwhile(pa != a) && (pb != b)/if (pb->data >= pa->data + borrow)tmp = pb->data - pa->data - borrow

29、;borrow = 0;elsetmp = 10000 + pb->data - pa->data - borrow;borrow = 1;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pb != b) /導(dǎo)入 b 中剩余if (pb->data >= borrow)tmp = pb->data - borrow;borrow = 0;elsetmp = 10000 - pb->data - borrow;borrow = 1;InsertNodeAtHead(c, tm

30、p);pb = pb->prior;pc = c->next;while(pc->next !=c && pc->data = 0) /為了防止頭因借位變?yōu)?的情況pc = pc->next;DelNode(c, pc->prior);本函數(shù)主要由1 個 while 與 2 個 if 語句構(gòu)成。int borrow = 0,tmp; borrow 表示借位,tmp 同加函數(shù)。第一個 while 語句:while(pa != a) && (pb != b)/判斷 a>b 還是 a<bif (pa->data &

31、gt;= pb->data + borrow)borrow = 0;elseborrow = 1;pa = pa->prior;pb = pb->prior;通過不斷地指向前驅(qū),以判斷 a 和 b 誰先到達頭結(jié)點,以判斷 a 和 b 的絕對值誰大,從而判斷符號是否正確。第一個 if 語句:if (pa != a | (pa = a && pb = b && borrow = 0)/ a >= bc->data = a->data;判斷a>b還是a<b,因為在AddList函數(shù)中,將b的符號賦予給c,但如果a 的絕對

32、值大于b的絕對值,則將a的符號賦予給c,已完成符號位的正確判斷。第二個 if 語句:if(c->data!=b->data)/|a|>|b|情況borrow=0;/重新置借位為0while(pa != a) && (pb != b)/不為符號位時進行if (pa->data >= pb->data + borrow) /因為 |a|>|b|, 應(yīng)該用大數(shù)減小數(shù)tmp = pa->data - pb->data - borrow; /考慮借位的減法borrow = 0;/借位置 0elsetmp = 10000 + pa-&g

33、t;data - pb->data - borrow; /需向前一位借 1borrow = 1;InsertNodeAtHead(c, tmp);/在 c 的頭結(jié)點后插入pa = pa->prior;pb = pb->prior;while(pa != a) /把a中剩余導(dǎo)入c,因為|a|>|b ,則只可能a有剩余if (pa->data >= borrow)tmp = pa->data - borrow;borrow = 0; elsetmp = 10000 - pa->data - borrow;borrow = 1;InsertNodeAt

34、Head(c, tmp);pa = pa->prior;Else 語句 : 大體內(nèi)容同上,只是|a|<|b| 的區(qū)別。DelNode() 函數(shù)的調(diào)用:pc = c->next;while(pc->next !=c && pc->data = 0)pc = pc->next;DelNode(c, pc->prior);這是為了防止開頭因借位變?yōu)? 的情況。例如: a=1,0000b=-1運算后為0,9999 ,這時 0時多余的,需要刪除。11刪除多余0:void DelNode(DualList L, DualNode *p)p->

35、prior->next = p->next;p->next->prior = p->prior;free(p);刪除結(jié)點12主函數(shù):int main()while(1)多組輸入/DualList a, b, c;a = InputData();b = InputData();c = AddList(a, b);printf("The result is:");PrintList(c);printf("*n");return 0;為了滿足實驗要求,采用while(1) 實現(xiàn)多組輸入。I*四、調(diào)試分析1. 遇到的問題在實驗中,主

36、要是在減函數(shù)中遇到的問題。首先我并沒有對a 和 b 的長度進行比較,而是直接開始對其相同長度的部分進行減法運算,對其借位進行的是borrow = borrow?0:1; 的操作,但在實現(xiàn)的過程中遇到了問題,借位總是會發(fā)生錯誤, 導(dǎo)致結(jié)果出錯。在最后通過先判斷其大小,再進行減法這一符合正常算法的方式,解決了這個問題。在調(diào)試時,并沒有考慮多組輸入問題,一個一個輸入輸入十分麻煩,采用while(1) 的方法。在輸入的時候,經(jīng)常會多按或稍按幾個數(shù),導(dǎo)致其調(diào)試十分麻煩,則在程序中添加算法解決這個麻煩。2. 算法的時空分析在本次實驗,主要是考慮長整數(shù)的加減法問題,并沒有太大的時間復(fù)雜度。其主要來源于輸入,

37、輸入的輸出,加減法運算,和輸出。由于這并不是一個很大的時間復(fù)雜度,改進的方式只能從鏈表的存儲下手,減少存入和調(diào)出的次數(shù)已減少時間復(fù)雜度。3. 經(jīng)驗體會本次實驗是求兩個無限長整數(shù)加減運算。由于沒有限制長度和必須使用鏈表來表示兩個長整數(shù),這樣來求它們的加減運算。在開始的時候,不知道怎么去做。 最后, 明白應(yīng)該用模塊化,將程序分成一個個小部分,在將他們串聯(lián)起來,才能完成。雖然中間遇到了許多困難,但同樣復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)的知識和復(fù)習(xí)鏈表。五、用戶使用說明用戶在使用該程序時,只需按照程序提示進行即可實現(xiàn)長整數(shù)的加減運算,具體使用步驟如下:1)按照輸入格式輸入2)此時會輸出你剛才的數(shù)值3)按照輸入格式輸入第二

38、個長整數(shù)4)此時會輸出你剛才的數(shù)值5)此時會輸出運算結(jié)果6)可重復(fù)上述操作,多次輸入六、測試結(jié)果與情況兩長整數(shù)a=b=0清枝般如一.形式箱八用 T二翌烈,每四位 月;12J4, 1231, 1L0-L 0您的輸入結(jié)果為:0_請按照如下形式輸入第二個長緲:-1234, 1234, 1234Q您的輸入結(jié)果為: 0您的運算結(jié)果為:0 b>a>0 a=1,1111,1111,1111 b=9,9999,9999,9999情技照如下先式輸入第一個長整數(shù),每四位一組:-12弘,12弘,12弘 1, 1111, 1111, 1111您的輸入結(jié)果為:13 1111, 1111, 1111情按照如下

39、形式輸入第二個長整數(shù):T2碼您4,12弘% 99 阻 ggg% gggg您的輸入結(jié)果為:% 99以 999% 9999您的運算結(jié)果為:IL 111L 1UL 1110 a>b>0 a=9999,9999,9999 b=2情按照如下形式輸入第一個長按數(shù),每四位一組:T23%12區(qū)12孔 9999, 9999t 9999您的輸入結(jié)果為: gggg gggg gggq青按船如下形布入第二個長整數(shù);T234, 1234, 1234 2國的輸入結(jié)果為:您的運算結(jié)果為:h 0。0, 0000, 0001 b<a<0 a=-2345,6789 b=-7654,3211請技照如下附式輸

40、入第一個長整數(shù),每四位一組:T2MJ2弘J2弘-2345,6789您的輸入結(jié)果為:-2345 678請按的如下形式輸入第二個長整數(shù):T2M 123蟲12M-7654 3211您的輸入結(jié)果為:-7654, 3211您的宏算結(jié)果為:-L 0000,0000 a<0,b>0,|a|>|b| a=-1,0000,00001 b=2|按照如下形式輸入第一個長整數(shù),每四位一組;T23&I234J234-1, 0000, 00001忸的輸入結(jié)果為:-LOOOa 0001請按照如下形蝌入第二個長黎數(shù):7234, 1Z34J2342您的輸入結(jié)果為:2您的運算結(jié)果為:7999, 0999

41、 a<0,b>0,|a|<|b| a=-9999 b=1,0000pC3|fF"請按照如下用式輸入第一個長整數(shù),每四位一組:T2弘,123蟲1234卜 9999區(qū)的輸入結(jié)果為:gggg請按,照如不用式輸入第二個長整數(shù):723生12弘,12弘1, 0000您的輸入轉(zhuǎn)果為:L 0000%的運算結(jié)果為:1 a>0,b<0,|a|>|b| a=1,0000,0000 b=-9999ft按照如下用式輸入第一個長整數(shù),每四位一組:-L2雞12叫12孔1, 0000, 0000修的輸入結(jié)果為:1.0000.0000詰按照如下形編ft入第二個長整數(shù);T23% 1Z

42、股,1234-9999惶的輸入結(jié)果為:-9999叵的運算結(jié)果為;9999, 0001 a>0,b<0,|a|<|b| a=1 b=-1,0000,0000,按照如下形式輸入第一個長整數(shù)每四位一組;T234112M4,1234士的輸入結(jié)果為:5按照如下形式輸入第二個長整數(shù):-12弘J2弘,1234-L 0000, 0000名的輸入結(jié)果為;-1, QQQQ.0QC0出的運苴結(jié)臬為:-螞99, 9999*. .n .*.4* * * *,*、*!1* :iB«油ik*ai24C 1*油.1* .* n*油.1* .* 1*. .*lH, w口 11ra 1*錯誤輸入(例:

43、輸入超過四位,則自動取其前四位進行運算)a=1,00000 b=-99998,01234請按冊如下形式輸入第一個長整數(shù).每四位一組:-123包12江,1234 1.00000恿的輸入結(jié)果為:L oooo法按期如下形式輸入第二個長整數(shù):72璃12泡1234-99998,01234缶的輸入結(jié)果為:-9999? 1234回的運算結(jié)果為:-9998, 1234錯誤輸入(例:非第一次輸入少于四位,則在輸入前加0補足四位進行 運算)a=1,000 b=-1,11口,/rur fl *«,(+/,,,+,+11,+.+,r+«r*.+i,+,,S,«®'r w

44、i ww r *+,,S,«®'r wi '1""r ,.+,+4'i'r bi rf. i,®r eH,+. rs i®'r J't rf請依照如下形裝輸入重一個k®E,短四根一組:-1234, 123& 12整 1,000您的輸入結(jié)果為:1, 0000請按照如下形式輸入第二個長整數(shù)! T2弭1234, 1234-1. 11您的輸入結(jié)果為:-1 0011您的運算結(jié)果為:-11附錄(源代碼):#include <stdio.h>#include <st

45、dlib.h>#include <ctype.h>typedef struct DualNodeint data;struct DualNode *prior, *next;DualNode, *DualList;DualList InitList(int sign)/ 頭結(jié)點存放符號位,1 為正, -1 為負DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;L->data = sign;return L;在鏈表最后插入void InsertNodeAtTail(D

46、ualList L, int data) / 尾插,用于存儲數(shù)據(jù)的輸入DualNode *s;s = (DualList)malloc(sizeof(DualNode);s->data = data;s->next = L;s->prior = L->prior;L->prior->next = s;L->prior = s;void InsertNodeAtHead(DualList L, int data)/ 即插在頭結(jié)點之后,用于計算結(jié)果的存儲DualNode *s;s = (DualList)malloc(sizeof(DualNode);s-

47、>data = data;s->next = L->next;s->prior = L;L->next->prior = s;L->next = s;void PrintList(DualList L)/ 打印結(jié)果int FirstTime = 1;DualNode *p = L;if (p->data = -1&&p->next->data!=0) printf("-");p = p->next;while(p != L)if (FirstTime)FirstTime = 0;printf(

48、"%d", p->data);elseprintf(",%04d", p->data);p = p->next;printf("n");DualList InputData() int count=0;int FirstNum = 1, data;char c;DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;if (c = getchar() = '-')L = InitList(-1);els

49、eL = InitList(1);if (isdigit(c) /判斷是否為10進制數(shù)/ 退格處理ungetc(c, stdin);doscanf("%d", &data);while(data>9999) data=data/10;InsertNodeAtTail(L, data);while(c = getchar() != 'n');printf(" 您的輸入結(jié)果為:n");PrintList(L);return L;void DelNode(DualList L, DualNode *p)p->prior-&g

50、t;next = p->next;p->next->prior = p->prior;free(p);void Add(DualList a, DualList b, DualList c)DualList pa, pb;int carry = 0, tmp;pa = a->prior;pb = b->prior;while(pa != a) && (pb != b)tmp = pa->data + pb->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elseca

51、rry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pa != a)/ pb = btmp = pa->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;while(pb != b)/ pa = atmp = pb->data + carry;if (tmp >= 10000)carry = 1;tmp -

52、= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pb = pb->prior;if (carry != 0)InsertNodeAtHead(c, 1);DualList pa, pb, pc;int borrow = 0,tmp;pa = a->prior;pb = b->prior;while(pa != a) && (pb != b)/判斷 a>b 還是 a<bif (pa->data >= pb->data + borrow)borrow = 0;elseborrow = 1;pa = pa->prior;pb = pb->prior;if (pa != a | (pa = a &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論