大整數(shù)運(yùn)算C語(yǔ)言實(shí)現(xiàn)C語(yǔ)言大作業(yè)報(bào)告+源碼
《大整數(shù)運(yùn)算C語(yǔ)言實(shí)現(xiàn)C語(yǔ)言大作業(yè)報(bào)告+源碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《大整數(shù)運(yùn)算C語(yǔ)言實(shí)現(xiàn)C語(yǔ)言大作業(yè)報(bào)告+源碼(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、一、設(shè)計(jì)高精度無(wú)符號(hào)大整數(shù)計(jì)算 (以1為存儲(chǔ)單位) 1.1 需求陳述 對(duì)數(shù)值很大、精度很高的數(shù)進(jìn)行高精度大整數(shù)計(jì)算是一類十分常見(jiàn)的問(wèn)題。但由于C語(yǔ)言中數(shù)據(jù)類型受數(shù)據(jù)長(zhǎng)度和范圍限制,普通數(shù)學(xué)計(jì)算很難實(shí)現(xiàn)此類問(wèn)題,為嘗試解決這個(gè)問(wèn)題,專門(mén)設(shè)計(jì)一個(gè)C語(yǔ)言程序用于無(wú)符號(hào)大整數(shù)的計(jì)算,實(shí)現(xiàn)無(wú)符號(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ù)組及其大小以及需要從第幾位開(kāi)始比較 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ì)算無(wú)符號(hào)大整形數(shù)據(jù)計(jì)算,最多可計(jì)算長(zhǎng)度為200位(即10的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長(zhǎng)度。該程序中所有運(yùn)算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計(jì)算和負(fù)數(shù)計(jì)算,除法結(jié)果中只分別計(jì)算商和余數(shù)。 1.2.3 技術(shù)約束 本程序已在code blocks下編譯通過(guò)。 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)字符串,傳入字符串首地址和長(zhǎng)度 在加法、減法、乘法計(jì)算中必須先對(duì)字符串進(jìn)行反轉(zhuǎn),是字符串整體逆轉(zhuǎn),但不改變字符串長(zhǎng)度。 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)行地位和高位比較,即從開(kāi)頭和結(jié)尾開(kāi)始進(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開(kāi)始存,故運(yùn)算結(jié)果從2開(kāi)始存。 實(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開(kāi)始做個(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
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)過(guò)減法之后才開(kāi)始++,保證結(jié)果從 res[1] 開(kāi)始存 (*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]開(kāi)始去零,結(jié)果為去零后的數(shù)組及其大??;從a[n]開(kāi)始去零,結(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ì)思想說(shuō)明 該程序中所有大整型無(wú)符號(hào)數(shù)據(jù)的運(yùn)算均采用模擬手算的方法,對(duì)單個(gè)數(shù)字進(jìn)行操作,以實(shí)現(xiàn)大整型運(yùn)算。為程序運(yùn)行更加高效,調(diào)用函數(shù)過(guò)程中傳輸多個(gè)參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 1.5 測(cè)試結(jié)果說(shuō)明 主界面:
17、 測(cè)試加法: 33 圖一 圖二 測(cè)試減法: 圖一 圖二 測(cè)試乘法: 圖一
18、 圖二 圖三 測(cè)試除法: 圖一 圖二 圖三 圖四 測(cè)試比較:(可采用程序二中的Del_zero_Str ()函數(shù)進(jìn)行對(duì)多余0的刪減) 圖一 圖二 注:以上數(shù)
19、據(jù)均為程序在Code Blocks 的寫(xiě)入文本的運(yùn)行結(jié)果,且該結(jié)果都通過(guò)了驗(yàn)證。 1.6 完整代碼 詳見(jiàn)程序文件BigN.c。 二、設(shè)計(jì)高精度無(wú)符號(hào)大整數(shù)計(jì)算 (以10000為存儲(chǔ)單位) 注:由于本程序在前一程序基礎(chǔ)上建立,故本程序主要介紹與前一程序的不同。 2.1 需求陳述 對(duì)數(shù)值更大、精度更高的數(shù)進(jìn)行高精度大整數(shù)計(jì)算是基于上一程序的又一問(wèn)題。但由于C語(yǔ)言中數(shù)據(jù)類型受數(shù)據(jù)長(zhǎng)度和范圍限制,前一程序很難實(shí)現(xiàn)更高位的運(yùn)算,為嘗試解決這個(gè)問(wèn)題,在前一程序的基礎(chǔ)上對(duì)無(wú)符號(hào)大整數(shù)的計(jì)算進(jìn)行了改進(jìn)實(shí)現(xiàn)無(wú)符號(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() 注:由于以萬(wàn)為存儲(chǔ)單位的程序?qū)Τǖ挠?jì)算效率過(guò)低,故不采用除法。 2.2.2 數(shù)據(jù)分析 該程序可用于計(jì)算無(wú)符號(hào)大整形數(shù)據(jù)計(jì)算,
21、最多可計(jì)算長(zhǎng)度為200位(即10000的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長(zhǎng)度。該程序中所有運(yùn)算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計(jì)算和負(fù)數(shù)計(jì)算。 2.2.3 技術(shù)約束 本程序已在code blocks下編譯通過(guò)。 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開(kāi)始存,故運(yùn)算結(jié)果從2開(kāi)始存。 實(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開(kāi)始做個(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]開(kāi)始去零,結(jié)果為去零后的字符串;用于比較兩個(gè)數(shù)的大小時(shí)被調(diào)用。 3.獲取兩個(gè)數(shù)的最大值Get_MAX() 同上。 2.4 設(shè)計(jì)思想說(shuō)明 該程序中所有大整型無(wú)符號(hào)數(shù)據(jù)的運(yùn)算均采用模擬手算的方法,對(duì)單個(gè)四位數(shù)字進(jìn)行操作,以實(shí)現(xiàn)大整型運(yùn)算。為程序運(yùn)行更加高效,調(diào)
30、用函數(shù)過(guò)程中傳輸多個(gè)參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 2.5 測(cè)試結(jié)果說(shuō)明 主界面截圖 測(cè)試加法: 圖一 圖二 測(cè)試減法: 圖一 圖二 測(cè)試乘法: 圖一
31、 圖二 測(cè)試除法: 測(cè)試比較: 注:以上數(shù)據(jù)均為程序在Code Blocks 環(huán)境下的運(yùn)行結(jié)果,且該結(jié)果都通過(guò)了驗(yàn)證。 2.6完整代碼 詳見(jiàn)程序文件WanBigN.c。 三、性能比較 說(shuō)明:該部分主要通過(guò)及時(shí)函數(shù)對(duì)兩個(gè)程序的性能進(jìn)行了比較,其中的計(jì)算時(shí)間為在純計(jì)算時(shí)間(不包含輸入用時(shí))的基礎(chǔ)上,空循環(huán)10 的 8 次方次所測(cè)時(shí)間。只比較了加法和除法。下面截圖為多次測(cè)試后選取的截圖。 加法: 程序一: 程序二: 除法: 程序一: 程序二: 結(jié)論:
32、 通過(guò)多次比較,程序二優(yōu)于程序一,運(yùn)行時(shí)間上略短,且運(yùn)算支持?jǐn)?shù)據(jù)更大。 源碼: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Name: 無(wú)符號(hào)大整型數(shù)據(jù)運(yùn)算和比較(1) * * Introduct: C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)大作業(yè)
33、 * * Thought: 用模擬手算的算法對(duì)大整形無(wú)符號(hào)數(shù)據(jù)進(jìn)行基本計(jì)算和比較(‘+’,‘-’,‘*’,‘/’), * * 采用整形數(shù)組存儲(chǔ),以 1 為單位進(jìn)行運(yùn)算。 * * Date: 2010/12/29 * * * * *
34、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
35、串,傳入字符串首地址和長(zhǎng)度 void InvertInt (int *, int ); //反轉(zhuǎn)數(shù)組,傳入數(shù)組首地址和大小 void Del_zero_low (int *, int *); //從a[1]開(kāi)始去零,結(jié)果為去零后的數(shù)組及其大小 void Del_zero_High(int *, int *); //從a[n]開(kāi)始去零,結(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ù)組及其大小以及需要從第幾位開(kāi)始比較 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ì)存數(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開(kāi)始存,乘法中結(jié)果從2開(kāi)始存 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)過(guò)乘法,則結(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開(kāi)始,一共有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
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書(shū)
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語(yǔ)文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告