大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼

上傳人:1777****777 文檔編號(hào):37805494 上傳時(shí)間:2021-11-04 格式:DOC 頁數(shù):33 大?。?61KB
收藏 版權(quán)申訴 舉報(bào) 下載
大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼_第1頁
第1頁 / 共33頁
大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼_第2頁
第2頁 / 共33頁
大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼_第3頁
第3頁 / 共33頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《大整數(shù)運(yùn)算C語言實(shí)現(xiàn)C語言大作業(yè)報(bào)告+源碼(33頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、一、設(shè)計(jì)高精度無符號(hào)大整數(shù)計(jì)算 (以1為存儲(chǔ)單位) 1.1 需求陳述 對(duì)數(shù)值很大、精度很高的數(shù)進(jìn)行高精度大整數(shù)計(jì)算是一類十分常見的問題。但由于C語言中數(shù)據(jù)類型受數(shù)據(jù)長度和范圍限制,普通數(shù)學(xué)計(jì)算很難實(shí)現(xiàn)此類問題,為嘗試解決這個(gè)問題,專門設(shè)計(jì)一個(gè)C語言程序用于無符號(hào)大整數(shù)的計(jì)算,實(shí)現(xiàn)無符號(hào)大整數(shù)的一般計(jì)算和比較功能。 1.2 需求分析 1.2.1 功能分析 表1 程序功能分析 項(xiàng)目 功能 分析 BigN 數(shù)據(jù)接收 以字符串形式接受 反轉(zhuǎn)字符串函數(shù)Invert() 用Translate()將字符串翻譯為

2、整形數(shù)組 數(shù)據(jù) 運(yùn)算 分別用BigN_cmp_low()和BigN_cmp_High()對(duì)數(shù)據(jù)進(jìn)行比較 //從a[1]對(duì)數(shù)組進(jìn)行比較,傳入兩個(gè)數(shù)組及其大小以及需要從第幾位開始比較 int BigN_cmp_High(int *, int *, int , int ); //從a[n]對(duì)數(shù)組進(jìn)行比較,傳入兩個(gè)數(shù)組及其大小 加法BigN_Add() 減法BigN_Min() 低位減法BigN_Min_low(),在未反轉(zhuǎn)的情況下計(jì)算 乘法BigN_Mul() 除法BigN_Div() 運(yùn)算輔助函數(shù) 反轉(zhuǎn)整形數(shù)組InvertInt() 從前面刪減多余的零Del_

3、zero_low() 從末尾刪減多余的零Del_zero_High() 獲取兩個(gè)數(shù)的最大值Get_MAX() 1.2.2 數(shù)據(jù)分析 該程序可用于計(jì)算無符號(hào)大整形數(shù)據(jù)計(jì)算,最多可計(jì)算長度為200位(即10的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長度。該程序中所有運(yùn)算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計(jì)算和負(fù)數(shù)計(jì)算,除法結(jié)果中只分別計(jì)算商和余數(shù)。 1.2.3 技術(shù)約束 本程序已在code blocks下編譯通過。 1.3 總體設(shè)計(jì) 1.3.1 全局?jǐn)?shù)據(jù)結(jié)構(gòu) 本程序中數(shù)據(jù)采取以個(gè)位

4、數(shù)字為單位存入整形數(shù)組,在數(shù)據(jù)計(jì)算和比較中對(duì)單個(gè)數(shù)組單元進(jìn)行操作。采用整形數(shù)組存儲(chǔ),主要優(yōu)點(diǎn)為可以在該程序的基礎(chǔ)上進(jìn)行改進(jìn),使字符串中每四個(gè)數(shù)字或更多存入一個(gè)數(shù)組單元中(如程序二)。 1.3.2 函數(shù)設(shè)計(jì) A.?dāng)?shù)據(jù)的接收 1.反轉(zhuǎn)字符串函數(shù) Invert() 函數(shù)原型:void Invert (char * , int ); 功能: 反轉(zhuǎn)字符串,傳入字符串首地址和長度 在加法、減法、乘法計(jì)算中必須先對(duì)字符串進(jìn)行反轉(zhuǎn),是字符串整體逆轉(zhuǎn),但不改變字符串長度。 2. 翻譯字符串函數(shù) Translate() 函數(shù)原型:void T

5、ranslate (char *, int *, int *); 功能:將字符串翻譯為數(shù)組,傳入字符串和數(shù)組及數(shù)組大小的地址 B. 數(shù)據(jù)運(yùn)算 1. 比較函數(shù) BigN_cmp_low()和BigN_cmp_High() 函數(shù)原型:int BigN_cmp_low (int *, int *, int , int , int ); 和int BigN_cmp_High(int *, int *, int , int ); 功能:對(duì)整形數(shù)組分別進(jìn)行地位和高位比較,即從開頭和結(jié)尾開始進(jìn)行比較。 實(shí)現(xiàn)步驟:先將數(shù)組中不必要

6、的零去掉,然后記下位數(shù),對(duì)位數(shù)進(jìn)行比較,最后從原始數(shù)據(jù)最高位進(jìn)行比較,逐步往下比較,若前面小于后面,則返回值為1,;若后面小于前面,則返回-1;若相等,則返回值為0. 2. 加法BigN_Add() 函數(shù)原型:void BigN_Add (int *, int *, int , int *); 功能:高精度加法,傳入反轉(zhuǎn)后的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:依次將所需計(jì)算的兩個(gè)數(shù)組及其位數(shù)的最大值傳入函數(shù),對(duì)兩個(gè)函數(shù)每一位進(jìn)行加法存入結(jié)果中,對(duì)滿十的結(jié)果進(jìn)行進(jìn)位,然后對(duì)該位進(jìn)行對(duì)十取余存入結(jié)果。 實(shí)現(xiàn)代碼:for(i = 1; i <= max

7、; i++) { res[i] += num1[i] + num2[i]; res[i+1] += res[i] / 10; res[i] %= 10; } 3. 減法BigN_Min()和低位減法BigN_Min_low() 函數(shù)原型:void BigN_Min (int *, int *, int , int *); void BigN_Min_low(int *, int *,

8、int , int , int *);; 功能: 高精度減法,傳入反轉(zhuǎn)后的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址。 高精度低位減法,傳入未反轉(zhuǎn)的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:依次將所需計(jì)算的兩個(gè)數(shù)組及其位數(shù)的最大值傳入函數(shù),對(duì)兩個(gè)函數(shù)每一位進(jìn)行減法存入結(jié)果中,對(duì)減不著的進(jìn)行借位,然后對(duì)該為進(jìn)行對(duì)十取余存入結(jié)果。 實(shí)現(xiàn)代碼:for(i = 1; i <= max; i++) if(num1[i] >= num2[i]) res[i] += num1[i] - num2[

9、i]; else { res[i] += num1[i] + 10 - num2[i]; num1[i+1] -= 1; } 4. 乘法BigN_Mul() 函數(shù)原型:void BigN_Mul (int *, int *, int , int , int *); 功能:高精度乘法,傳入反轉(zhuǎn)后的數(shù)組及其大小,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:對(duì)兩個(gè)函數(shù)的每一位進(jìn)行乘法,然后對(duì)于大于10的結(jié)果進(jìn)

10、行進(jìn)位操作。由于該程序中所有數(shù)組均從1開始存,故運(yùn)算結(jié)果從2開始存。 實(shí)現(xiàn)代碼:for(i = 1;i <= bit1; i++) for(j = 1;j <= bit2; j++) { res[i+j] += num1[i] * num2[j]; res[i+j+1] += res[i+j] / 10; res[i+j] %= 10; } 5. 除法BigN_D

11、iv() 函數(shù)原型:void BigN_Div (int *, int *, int , int , int *, int *, int *, int *); 功能:高精度除法,傳入未反轉(zhuǎn)的數(shù)組及其大小、商的首地址、余數(shù)的首地址、商的位數(shù)、余數(shù)的位數(shù). 實(shí)現(xiàn)步驟:將未經(jīng)反轉(zhuǎn)的數(shù)組傳入,從0開始做個(gè)操作,循環(huán)利用比較和減法,若余數(shù)大于除數(shù),則進(jìn)行減法調(diào)用,此處用到的減法為低位減法. 實(shí)現(xiàn)代碼:*res_bit = 1; for(i = 1;i <= bit1; i++) { Del_zero_low(mod,bit_mod);//對(duì)m

12、od低位去零 if(BigN_cmp_low(mod,num2,*bit_mod,bit2,1) > 0)//mod num2 { for(j = 1;j <= (*bit_mod)

13、; j++) temp[j] = 0;//每次將余數(shù)的結(jié)果置為 0 BigN_Min_low(mod,num2,(*bit_mod),bit2,temp); (res[*res_bit])++; for(j = 1;j <= (*bit_mod);j++) mod[j] = 0;//mod 置零 Del_zero_low(temp,bit_mod);//對(duì) mod 低位去零,防止如“001”的結(jié)果

14、for(j = 1; j<=(*bit_mod); j++) mod[j] = temp[j];//將mod值給mod,做下一次計(jì)算 flag = 1; } if(flag == 1)//只有經(jīng)過減法之后才開始++,保證結(jié)果從 res[1] 開始存 (*res_bit)++; } C. 運(yùn)算輔助函數(shù) 1. 反轉(zhuǎn)整形數(shù)組InvertInt() 函數(shù)原型:void InvertInt (int *, int ); 功能:反轉(zhuǎn)數(shù)組,傳入數(shù)組首地

15、址和大小.將數(shù)組的存儲(chǔ)順序進(jìn)行對(duì)調(diào),實(shí)現(xiàn)整形數(shù)組的反轉(zhuǎn)。 2. 刪減多余的零Del_zero_low()和Del_zero_High() 函數(shù)原型:void Del_zero_low (int *, int *); void Del_zero_High(int *, int *); 功能:從a[1]開始去零,結(jié)果為去零后的數(shù)組及其大小;從a[n]開始去零,結(jié)果為去零后的數(shù)組及其大小,用于比較兩個(gè)數(shù)的大小和控制輸出時(shí)被調(diào)用。傳入整形數(shù)組和位數(shù)的地址,對(duì)整形數(shù)組和位數(shù)進(jìn)行操作。 3. 獲取兩個(gè)數(shù)的最大值Get_MAX() 函數(shù)原型:int Get_MAX (

16、int , int ); 功能:獲取兩個(gè)數(shù)的最大值,返回值為大的那個(gè)數(shù)。 實(shí)現(xiàn)代碼:return a>b?a:b; 1.4 設(shè)計(jì)思想說明 該程序中所有大整型無符號(hào)數(shù)據(jù)的運(yùn)算均采用模擬手算的方法,對(duì)單個(gè)數(shù)字進(jìn)行操作,以實(shí)現(xiàn)大整型運(yùn)算。為程序運(yùn)行更加高效,調(diào)用函數(shù)過程中傳輸多個(gè)參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 1.5 測試結(jié)果說明 主界面:

17、 測試加法: 33 圖一 圖二 測試減法: 圖一 圖二 測試乘法: 圖一

18、 圖二 圖三 測試除法: 圖一 圖二 圖三 圖四 測試比較:(可采用程序二中的Del_zero_Str ()函數(shù)進(jìn)行對(duì)多余0的刪減) 圖一 圖二 注:以上數(shù)

19、據(jù)均為程序在Code Blocks 的寫入文本的運(yùn)行結(jié)果,且該結(jié)果都通過了驗(yàn)證。 1.6 完整代碼 詳見程序文件BigN.c。 二、設(shè)計(jì)高精度無符號(hào)大整數(shù)計(jì)算 (以10000為存儲(chǔ)單位) 注:由于本程序在前一程序基礎(chǔ)上建立,故本程序主要介紹與前一程序的不同。 2.1 需求陳述 對(duì)數(shù)值更大、精度更高的數(shù)進(jìn)行高精度大整數(shù)計(jì)算是基于上一程序的又一問題。但由于C語言中數(shù)據(jù)類型受數(shù)據(jù)長度和范圍限制,前一程序很難實(shí)現(xiàn)更高位的運(yùn)算,為嘗試解決這個(gè)問題,在前一程序的基礎(chǔ)上對(duì)無符號(hào)大整數(shù)的計(jì)算進(jìn)行了改進(jìn)實(shí)現(xiàn)無符號(hào)大整數(shù)的一般計(jì)算和比較功能。而且改進(jìn)后

20、的程序運(yùn)行更為高效。 2.2 需求分析 2.2.1 功能分析 表1 程序功能分析 項(xiàng)目 功能 分析 Wan BigN 數(shù)據(jù)接收 用Wan_TransGT ()將字符串翻譯為整形數(shù)組 運(yùn)算輔助函數(shù) 傳入整形n,計(jì)算10的n次方 IntPow_ten () 從前面刪減對(duì)字符串多余的‘0’Del_zero_Str () 不再使用從末尾刪減多余的零Del_zero_High() 注:由于以萬為存儲(chǔ)單位的程序?qū)Τǖ挠?jì)算效率過低,故不采用除法。 2.2.2 數(shù)據(jù)分析 該程序可用于計(jì)算無符號(hào)大整形數(shù)據(jù)計(jì)算,

21、最多可計(jì)算長度為200位(即10000的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長度。該程序中所有運(yùn)算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計(jì)算和負(fù)數(shù)計(jì)算。 2.2.3 技術(shù)約束 本程序已在code blocks下編譯通過。 2.3 總體設(shè)計(jì) 2.3.1 全局?jǐn)?shù)據(jù)結(jié)構(gòu) 本程序中數(shù)據(jù)采取以10000為單位存入整形數(shù)組,在數(shù)據(jù)計(jì)算和比較中對(duì)單個(gè)數(shù)組單元進(jìn)行操作。 2.3.2 函數(shù)設(shè)計(jì) A.?dāng)?shù)據(jù)的接收 1.反轉(zhuǎn)字符串函數(shù) Invert() 同上。 2. 翻譯字符串函數(shù)

22、 Wan_TransGT () 函數(shù)原型:void Wan_TransGT(char *str,int *num, int *bit) 功能:將字符串翻譯為數(shù)組,傳入字符串和數(shù)組及數(shù)組大小的地址 實(shí)現(xiàn)代碼: if(strlen(str)%4 != 0) for(i = 0; i < (strlen(str)/4+1)*4; i++) { if(i%4==0) (*bit)++; if(str[i] != 0) num[*bit]

23、+= (str[i]-0) * IntPow_ten(i%4); } else for(i = 0; i < strlen(str); i++) { if(i%4==0) (*bit)++; if(str[i] != 0) num[*bit] += (str[i]-0) * IntPow_ten(i%4); } B. 數(shù)據(jù)運(yùn)算 1. 比較函數(shù) BigN_cmp_low()和Big

24、N_cmp_High() 同上. 2. 加法BigN_Add() 函數(shù)原型:void BigN_Add (int *, int *, int , int *); 功能:高精度加法,傳入反轉(zhuǎn)后的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:依次將所需計(jì)算的兩個(gè)數(shù)組及其位數(shù)的最大值傳入函數(shù),對(duì)兩個(gè)函數(shù)每一位進(jìn)行加法存入結(jié)果中,對(duì)滿10000的結(jié)果進(jìn)行進(jìn)位,然后對(duì)該位進(jìn)行對(duì)10000取余存入結(jié)果。 實(shí)現(xiàn)代碼:for(i = 1; i <= max; i++) { res[i] += num1[i]

25、+ num2[i]; res[i+1] += res[i] / 10000; res[i] %= 10000; } 3. 減法BigN_Min()和低位減法BigN_Min_low() 函數(shù)原型:void BigN_Min (int *, int *, int , int *); 功能: 高精度減法,傳入反轉(zhuǎn)后的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:依次將所需計(jì)算的兩個(gè)數(shù)組及其位數(shù)的最大值傳入函數(shù),對(duì)兩個(gè)函數(shù)每一位進(jìn)行減法存入結(jié)果中,對(duì)減不著的進(jìn)行借位,然

26、后對(duì)該為進(jìn)行對(duì)十取余存入結(jié)果。 實(shí)現(xiàn)代碼:for(i = 1; i <= max; i++) if(num1[i] >= num2[i]) res[i] += num1[i] - num2[i]; else { res[i] += num1[i] + 10000 - num2[i]; num1[i+1] -= 1; } 4. 乘法Big

27、N_Mul() 函數(shù)原型:void BigN_Mul (int *, int *, int , int , int *); 功能:高精度乘法,傳入反轉(zhuǎn)后的數(shù)組及其大小,和結(jié)果數(shù)組的首地址。 實(shí)現(xiàn)步驟:對(duì)兩個(gè)函數(shù)的每一位進(jìn)行乘法,然后對(duì)于大于10000的結(jié)果進(jìn)行進(jìn)位操作。由于該程序中所有數(shù)組均從1開始存,故運(yùn)算結(jié)果從2開始存。 實(shí)現(xiàn)代碼:for(i = 1;i <= bit1; i++) for(j = 1;j <= bit2; j++) { res[i+j] +=

28、 num1[i] * num2[j]; res[i+j+1] += res[i+j] / 10000; res[i+j] %= 10000; } 5. 除法BigN_Div() 函數(shù)原型:void BigN_Div (int *, int *, int , int , int *, int *, int *, int *); 功能:高精度除法,傳入未反轉(zhuǎn)的數(shù)組及其大小、商的首地址、余數(shù)的首地址、商的位數(shù)、余數(shù)的位數(shù). 實(shí)現(xiàn)步驟:將未經(jīng)反轉(zhuǎn)的數(shù)組傳入,

29、從0開始做個(gè)操作,循環(huán)利用比較和減法,若余數(shù)大于除數(shù),則進(jìn)行減法調(diào)用,此處用到的減法為低位減法. C. 運(yùn)算輔助函數(shù) 1.反轉(zhuǎn)整形數(shù)組InvertInt() 同上。 2.刪減多余的零Del_zero_str() 函數(shù)原型:void Del_zero_str (char *); 功能:從str[1]開始去零,結(jié)果為去零后的字符串;用于比較兩個(gè)數(shù)的大小時(shí)被調(diào)用。 3.獲取兩個(gè)數(shù)的最大值Get_MAX() 同上。 2.4 設(shè)計(jì)思想說明 該程序中所有大整型無符號(hào)數(shù)據(jù)的運(yùn)算均采用模擬手算的方法,對(duì)單個(gè)四位數(shù)字進(jìn)行操作,以實(shí)現(xiàn)大整型運(yùn)算。為程序運(yùn)行更加高效,調(diào)

30、用函數(shù)過程中傳輸多個(gè)參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 2.5 測試結(jié)果說明 主界面截圖 測試加法: 圖一 圖二 測試減法: 圖一 圖二 測試乘法: 圖一

31、 圖二 測試除法: 測試比較: 注:以上數(shù)據(jù)均為程序在Code Blocks 環(huán)境下的運(yùn)行結(jié)果,且該結(jié)果都通過了驗(yàn)證。 2.6完整代碼 詳見程序文件WanBigN.c。 三、性能比較 說明:該部分主要通過及時(shí)函數(shù)對(duì)兩個(gè)程序的性能進(jìn)行了比較,其中的計(jì)算時(shí)間為在純計(jì)算時(shí)間(不包含輸入用時(shí))的基礎(chǔ)上,空循環(huán)10 的 8 次方次所測時(shí)間。只比較了加法和除法。下面截圖為多次測試后選取的截圖。 加法: 程序一: 程序二: 除法: 程序一: 程序二: 結(jié)論:

32、 通過多次比較,程序二優(yōu)于程序一,運(yùn)行時(shí)間上略短,且運(yùn)算支持?jǐn)?shù)據(jù)更大。 源碼: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Name: 無符號(hào)大整型數(shù)據(jù)運(yùn)算和比較(1) * * Introduct: C語言程序設(shè)計(jì)基礎(chǔ)大作業(yè)

33、 * * Thought: 用模擬手算的算法對(duì)大整形無符號(hào)數(shù)據(jù)進(jìn)行基本計(jì)算和比較(‘+’,‘-’,‘*’,‘/’), * * 采用整形數(shù)組存儲(chǔ),以 1 為單位進(jìn)行運(yùn)算。 * * Date: 2010/12/29 * * * * *

34、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include #define MAX 200 #define MAX_Res 50000 int Get_MAX (int , int ); //獲取兩個(gè)數(shù)的最大值,返回值為大的那個(gè)數(shù) void Invert (char *, int ); //反轉(zhuǎn)字符

35、串,傳入字符串首地址和長度 void InvertInt (int *, int ); //反轉(zhuǎn)數(shù)組,傳入數(shù)組首地址和大小 void Del_zero_low (int *, int *); //從a[1]開始去零,結(jié)果為去零后的數(shù)組及其大小 void Del_zero_High(int *, int *); //從a[n]開始去零,結(jié)果為去零后的數(shù)組及其大小 void Translate (char *, int *, int *); //將字符串翻譯為數(shù)組,傳入字符串和數(shù)組及數(shù)組大小的地址 int BigN_cmp_low (int *, i

36、nt *, int , int , int ); //從a[1]對(duì)數(shù)組進(jìn)行比較,傳入兩個(gè)數(shù)組及其大小以及需要從第幾位開始比較 int BigN_cmp_High(int *, int *, int , int ); //從a[n]對(duì)數(shù)組進(jìn)行比較,傳入兩個(gè)數(shù)組及其大小 void BigN_Add (int *, int *, int , int *); //高精度加法,傳入反轉(zhuǎn)后的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址 void BigN_Min (int *, int *, int , int *); //高精度減法,傳入反轉(zhuǎn)后

37、的數(shù)組及其大小的最大值,和結(jié)果數(shù)組的首地址 void BigN_Min_low (int *, int *, int , int , int *); //高精度減法,傳入未反轉(zhuǎn)的數(shù)組及其大小,和結(jié)果數(shù)組的首地址 void BigN_Mul (int *, int *, int , int , int *); //高精度乘法,傳入反轉(zhuǎn)后的數(shù)組及其大小,和結(jié)果數(shù)組的首地址 void BigN_Div (int *, int *, int , int , int *, int *, int *, int *); //高精度除法,傳入未反轉(zhuǎn)的數(shù)組及其

38、大小、商的首地址、余數(shù)的首地址、商的位數(shù)、余數(shù)的位數(shù) int main() { char str1[MAX] = {0}, str2[MAX] = {0}, ch;//用字符串接收輸入 while(1) { int num1[MAX] = {0}, num2[MAX] = {0}, res[MAX_Res] = {0}, mod[MAX] = {0};//num以數(shù)組的形勢存數(shù),res存結(jié)果,mod存余數(shù) int i = 0, bit1 = 0, bit2 = 0, res_bit = 0, max = 0, bit_m

39、in = 0, res_cmp = 0,div_bit_mod = 0; //bit_min控制輸出時(shí)的最低位,因?yàn)閚um從1開始存,乘法中結(jié)果從2開始存 printf("\nWhich operation do you want to do ?\n [1] A+B\n [2] A-B\n [3] A*B\n [4] A/B\n [5] A?B\n [0] exit\nPlease choose..."); scanf(" %c",&ch); if(ch == 1||ch == 2||ch == 3||ch == 4||c

40、h == 5) { system("cls"); printf("Please input number A:\n"); scanf("%s",str1); //連續(xù)輸入 printf("Please input number B:\n"); scanf("%s",str2); } if(ch == 1||ch == 2||ch == 3) { Invert(str1,

41、strlen(str1));//將字符串反轉(zhuǎn) Invert(str2,strlen(str2)); Translate(str1,num1,&bit1); Translate(str2,num2,&bit2); max = Get_MAX(bit1,bit2); } switch(ch) { case1: BigN_Add(num1,num2,max,res);

42、 break; case2: Del_zero_High(num1, &bit1); Del_zero_High(num2, &bit2); if(BigN_cmp_High(num1,num2,bit1,bit2) > 0)//判斷兩個(gè)數(shù)的大小,NUM1

43、 break; } else { BigN_Min(num1,num2,max,res); break; } case3: BigN_Mul(num1,num2,bit1,bit2,res); bit_min=1;//經(jīng)過乘法,則結(jié)果從res[2]輸出

44、 break; case4: Translate(str1,num1,&bit1); Translate(str2,num2,&bit2); Del_zero_low(num1, &bit1); Del_zero_low(num2, &bit2); if(bit2 == 0) { printf("I

45、nput error !\n"); system("pause"); system("cls"); continue; } if((res_cmp = BigN_cmp_low(num1,num2,bit1,bit2,1)) < 0)//若num1>num2則調(diào)用函數(shù) BigN_Div(num1,num2,bit1,bit2,res,mod,&res_bit,&

46、div_bit_mod); break; case5: Translate(str1,num1,&bit1); Translate(str2,num2,&bit2); res_cmp = BigN_cmp_low(num1,num2,bit1,bit2,1); break; case0: printf("Thanks to use!\n");

47、 return 0; default: printf("Input error !\n"); system("pause"); system("cls"); continue; } //下面是控制輸出 printf("\n\nThe result is:\n\n\t================================\n\t");

48、 if(ch == 4) { if(res_cmp > 0) { printf("The quotient is:\n\t 0\n\tThe mod is:\n\t "); if(bit1 == 0) putchar(0); else for(i = 1; i <= bit1; i++)

49、 printf("%d",num1[i]); } if(res_cmp == 0) printf("The quotient is:\n \t1\n\tThe mod is:\n \t0"); if(res_cmp < 0) { printf("The quotient is:\n\t "); for(i = 1; i < res_bit; printf("%d",res[

50、i++])) ; Del_zero_low(mod,&div_bit_mod); printf("\n\tThe mod is:\n\t "); if(div_bit_mod <= 0) putchar(0); for(i = 1; i <= div_bit_mod; printf("%d",mod[i++])) ; } } if(ch == 5)

51、 { if(res_cmp > 0) printf("%s < %s\n",str1,str2); if(res_cmp < 0) printf("%s > %s\n",str1,str2); if(res_cmp == 0) printf("%s = %s\n",str1,str2); } if(ch == 1||ch == 2||ch == 3)

52、{ for(i = MAX_Res-1; i >= 0; i--) if(res[i] != 0) { res_bit = i; break; } if(ch == 2)//控制減法的正負(fù)號(hào) if(BigN_cmp_High(num1,num2,bit1,bit2) > 0) putc

53、har(-); if(res_bit <= bit_min) putchar(0); for(i = res_bit; i > bit_min; printf("%d",res[i--])) ; } printf("\n\t================================\n\nPress [1] to continue...\nPress [0] to exit...\n"); scanf(" %c",&ch); if(

54、ch == 0) { printf("Thank to use !\n"); return 0; } system("cls"); memset(str1,0,sizeof(str1)); memset(str2,0,sizeof(str2)); } } void Del_zero_low(int *a, int *n) { int i, bit_zero, p = *n; for(i = 1; i <= p; i

55、++) if(a[i] != 0) break; else (*n)--; bit_zero = i-1;//零的個(gè)數(shù) for(i = 1; i <= *n; a[i++] = a[i + bit_zero]) ; } void Del_zero_High(int *a, int *n) { int i, p = *n; for(i = p; i > 0; i--) if(a[i] != 0) break;

56、 else (*n)--; } int Get_MAX(int a,int b) { return a>b?a:b; } void Invert(char *str,int len)//反轉(zhuǎn)字符串 { int i; char temp; for(i=0;i<(len>>1);++i) { temp = str[i]; str[i] = str[len-i-1]; str[len-i-1] = temp; } } voi

57、d InvertInt(int *a,int n)//反轉(zhuǎn)字符串 { int i; int temp; for(i=1;i<=(n>>1);i++) { temp = a[i]; a[i] = a[n-i+1]; a[n-i+1] = temp; } } void Translate(char *str,int *num, int *bit)//將字符翻譯為數(shù)組 { int i; for(i = 0; i < MAX; i++) if(str

58、[i] != 0) num[++(*bit)] = str[i] - 0;//num從1開始,一共有bit個(gè) } int BigN_cmp_High(int *num1,int *num2,int bit1,int bit2)//1為前面小,-1為后面小 { if(bit1 < bit2 || (bit1 == bit2 && num1[bit1] < num2[bit2])) return 1;//num1 < num2 if(bit1 > bit2 || (bit1 == bit2 && num1[bit1] > n

59、um2[bit2])) return -1; if(bit1 == bit2 && num1[bit1] == num2[bit2]) { bit1--; bit2--; BigN_cmp_High(num1,num2,bit1,bit2); } if(bit1 == 1 && bit2 == 1) return 0; } int BigN_cmp_low(int *num1,int *num2,int bit1,int bit2,int i)//從低位比較

60、 { Del_zero_low(num1, &bit1); Del_zero_low(num2, &bit2); if(bit1 < bit2 || (bit1 == bit2 && num1[i] < num2[i])) return 1;//num1 < num2 if(bit1 > bit2 || (bit1 == bit2 && num1[i] > num2[i])) return -1; if(i == bit1 && i == bit2) return 0; if(b

61、it1 == bit2 && num1[i] == num2[i]) { i++; BigN_cmp_low(num1,num2,bit1,bit2,i); } } void BigN_Add(int *num1,int *num2,int max,int *res) { int i = 0; for(i = 1; i <= max; i++) { res[i] += num1[i] + num2[i]; res[i+1] += res[i] / 10;

62、 res[i] %= 10; } } void BigN_Min(int *num1,int *num2,int max,int *res)//num1-num2 { int i; for(i = 1; i <= max; i++) if(num1[i] >= num2[i]) res[i] += num1[i] - num2[i]; else { res[i] += num1[i] + 10 - num2[i];

63、 num1[i+1] -= 1; } } void BigN_Min_low(int *num1,int *num2,int bit1,int bit2,int *res)//num1-num2 { int i , max; InvertInt(num1,bit1); InvertInt(num2,bit2); max = Get_MAX(bit1,bit2); for(i = 1; i <= max; i++) { if(num1[i] >= num2[i])

64、 res[i] += num1[i] - num2[i]; else { res[i] += num1[i] + 10 - num2[i]; num1[i+1] -= 1; } } InvertInt(num1,bit1); InvertInt(num2,bit2); InvertInt(res,bit1); } void BigN_Mul(int *num1,int *num2,int bit1,int

65、 bit2,int *res) { int i, j; for(i = 1;i <= bit1; i++) for(j = 1;j <= bit2; j++) { res[i+j] += num1[i] * num2[j]; res[i+j+1] += res[i+j] / 10; res[i+j] %= 10; } } void BigN_Div(int *num1,int *num2,int bit1,int bit2,i

66、nt *res,int *mod,int *res_bit, int *bit_mod) { int i, j, flag = 0; int temp[MAX] = {0}; *res_bit = 1; for(i = 1;i <= bit1; i++) { Del_zero_low(mod,bit_mod);//對(duì)mod低位去零 if(BigN_cmp_low(mod,num2,*bit_mod,bit2,1) > 0)//mod num

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!