大整數(shù)運算C語言實現(xiàn)C語言大作業(yè)報告+源碼
《大整數(shù)運算C語言實現(xiàn)C語言大作業(yè)報告+源碼》由會員分享,可在線閱讀,更多相關(guān)《大整數(shù)運算C語言實現(xiàn)C語言大作業(yè)報告+源碼(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、一、設(shè)計高精度無符號大整數(shù)計算 (以1為存儲單位) 1.1 需求陳述 對數(shù)值很大、精度很高的數(shù)進(jìn)行高精度大整數(shù)計算是一類十分常見的問題。但由于C語言中數(shù)據(jù)類型受數(shù)據(jù)長度和范圍限制,普通數(shù)學(xué)計算很難實現(xiàn)此類問題,為嘗試解決這個問題,專門設(shè)計一個C語言程序用于無符號大整數(shù)的計算,實現(xiàn)無符號大整數(shù)的一般計算和比較功能。 1.2 需求分析 1.2.1 功能分析 表1 程序功能分析 項目 功能 分析 BigN 數(shù)據(jù)接收 以字符串形式接受 反轉(zhuǎn)字符串函數(shù)Invert() 用Translate()將字符串翻譯為
2、整形數(shù)組 數(shù)據(jù) 運算 分別用BigN_cmp_low()和BigN_cmp_High()對數(shù)據(jù)進(jìn)行比較 //從a[1]對數(shù)組進(jìn)行比較,傳入兩個數(shù)組及其大小以及需要從第幾位開始比較 int BigN_cmp_High(int *, int *, int , int ); //從a[n]對數(shù)組進(jìn)行比較,傳入兩個數(shù)組及其大小 加法BigN_Add() 減法BigN_Min() 低位減法BigN_Min_low(),在未反轉(zhuǎn)的情況下計算 乘法BigN_Mul() 除法BigN_Div() 運算輔助函數(shù) 反轉(zhuǎn)整形數(shù)組InvertInt() 從前面刪減多余的零Del_
3、zero_low() 從末尾刪減多余的零Del_zero_High() 獲取兩個數(shù)的最大值Get_MAX() 1.2.2 數(shù)據(jù)分析 該程序可用于計算無符號大整形數(shù)據(jù)計算,最多可計算長度為200位(即10的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長度。該程序中所有運算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計算和負(fù)數(shù)計算,除法結(jié)果中只分別計算商和余數(shù)。 1.2.3 技術(shù)約束 本程序已在code blocks下編譯通過。 1.3 總體設(shè)計 1.3.1 全局?jǐn)?shù)據(jù)結(jié)構(gòu) 本程序中數(shù)據(jù)采取以個位
4、數(shù)字為單位存入整形數(shù)組,在數(shù)據(jù)計算和比較中對單個數(shù)組單元進(jìn)行操作。采用整形數(shù)組存儲,主要優(yōu)點為可以在該程序的基礎(chǔ)上進(jìn)行改進(jìn),使字符串中每四個數(shù)字或更多存入一個數(shù)組單元中(如程序二)。 1.3.2 函數(shù)設(shè)計 A.?dāng)?shù)據(jù)的接收 1.反轉(zhuǎn)字符串函數(shù) Invert() 函數(shù)原型:void Invert (char * , int ); 功能: 反轉(zhuǎn)字符串,傳入字符串首地址和長度 在加法、減法、乘法計算中必須先對字符串進(jìn)行反轉(zhuǎn),是字符串整體逆轉(zhuǎn),但不改變字符串長度。 2. 翻譯字符串函數(shù) Translate() 函數(shù)原型:void T
5、ranslate (char *, int *, int *); 功能:將字符串翻譯為數(shù)組,傳入字符串和數(shù)組及數(shù)組大小的地址 B. 數(shù)據(jù)運算 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 ); 功能:對整形數(shù)組分別進(jìn)行地位和高位比較,即從開頭和結(jié)尾開始進(jìn)行比較。 實現(xiàn)步驟:先將數(shù)組中不必要
6、的零去掉,然后記下位數(shù),對位數(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ù)組的首地址。 實現(xiàn)步驟:依次將所需計算的兩個數(shù)組及其位數(shù)的最大值傳入函數(shù),對兩個函數(shù)每一位進(jìn)行加法存入結(jié)果中,對滿十的結(jié)果進(jìn)行進(jìn)位,然后對該位進(jìn)行對十取余存入結(jié)果。 實現(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ù)組的首地址。 實現(xiàn)步驟:依次將所需計算的兩個數(shù)組及其位數(shù)的最大值傳入函數(shù),對兩個函數(shù)每一位進(jìn)行減法存入結(jié)果中,對減不著的進(jìn)行借位,然后對該為進(jìn)行對十取余存入結(jié)果。 實現(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ù)組的首地址。 實現(xiàn)步驟:對兩個函數(shù)的每一位進(jìn)行乘法,然后對于大于10的結(jié)果進(jìn)
10、行進(jìn)位操作。由于該程序中所有數(shù)組均從1開始存,故運算結(jié)果從2開始存。 實現(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ù). 實現(xiàn)步驟:將未經(jīng)反轉(zhuǎn)的數(shù)組傳入,從0開始做個操作,循環(huán)利用比較和減法,若余數(shù)大于除數(shù),則進(jìn)行減法調(diào)用,此處用到的減法為低位減法. 實現(xiàn)代碼:*res_bit = 1; for(i = 1;i <= bit1; i++) { Del_zero_low(mod,bit_mod);//對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);//對 mod 低位去零,防止如“001”的結(jié)果
14、for(j = 1; j<=(*bit_mod); j++) mod[j] = temp[j];//將mod值給mod,做下一次計算 flag = 1; } if(flag == 1)//只有經(jīng)過減法之后才開始++,保證結(jié)果從 res[1] 開始存 (*res_bit)++; } C. 運算輔助函數(shù) 1. 反轉(zhuǎn)整形數(shù)組InvertInt() 函數(shù)原型:void InvertInt (int *, int ); 功能:反轉(zhuǎn)數(shù)組,傳入數(shù)組首地
15、址和大小.將數(shù)組的存儲順序進(jìn)行對調(diào),實現(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ù)組及其大小,用于比較兩個數(shù)的大小和控制輸出時被調(diào)用。傳入整形數(shù)組和位數(shù)的地址,對整形數(shù)組和位數(shù)進(jìn)行操作。 3. 獲取兩個數(shù)的最大值Get_MAX() 函數(shù)原型:int Get_MAX (
16、int , int ); 功能:獲取兩個數(shù)的最大值,返回值為大的那個數(shù)。 實現(xiàn)代碼:return a>b?a:b; 1.4 設(shè)計思想說明 該程序中所有大整型無符號數(shù)據(jù)的運算均采用模擬手算的方法,對單個數(shù)字進(jìn)行操作,以實現(xiàn)大整型運算。為程序運行更加高效,調(diào)用函數(shù)過程中傳輸多個參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 1.5 測試結(jié)果說明 主界面:
17、 測試加法: 33 圖一 圖二 測試減法: 圖一 圖二 測試乘法: 圖一
18、 圖二 圖三 測試除法: 圖一 圖二 圖三 圖四 測試比較:(可采用程序二中的Del_zero_Str ()函數(shù)進(jìn)行對多余0的刪減) 圖一 圖二 注:以上數(shù)
19、據(jù)均為程序在Code Blocks 的寫入文本的運行結(jié)果,且該結(jié)果都通過了驗證。 1.6 完整代碼 詳見程序文件BigN.c。 二、設(shè)計高精度無符號大整數(shù)計算 (以10000為存儲單位) 注:由于本程序在前一程序基礎(chǔ)上建立,故本程序主要介紹與前一程序的不同。 2.1 需求陳述 對數(shù)值更大、精度更高的數(shù)進(jìn)行高精度大整數(shù)計算是基于上一程序的又一問題。但由于C語言中數(shù)據(jù)類型受數(shù)據(jù)長度和范圍限制,前一程序很難實現(xiàn)更高位的運算,為嘗試解決這個問題,在前一程序的基礎(chǔ)上對無符號大整數(shù)的計算進(jìn)行了改進(jìn)實現(xiàn)無符號大整數(shù)的一般計算和比較功能。而且改進(jìn)后
20、的程序運行更為高效。 2.2 需求分析 2.2.1 功能分析 表1 程序功能分析 項目 功能 分析 Wan BigN 數(shù)據(jù)接收 用Wan_TransGT ()將字符串翻譯為整形數(shù)組 運算輔助函數(shù) 傳入整形n,計算10的n次方 IntPow_ten () 從前面刪減對字符串多余的‘0’Del_zero_Str () 不再使用從末尾刪減多余的零Del_zero_High() 注:由于以萬為存儲單位的程序?qū)Τǖ挠嬎阈蔬^低,故不采用除法。 2.2.2 數(shù)據(jù)分析 該程序可用于計算無符號大整形數(shù)據(jù)計算,
21、最多可計算長度為200位(即10000的200次方大?。┑臄?shù)據(jù),但在原代碼中可以隨數(shù)據(jù)需求改變最大長度。該程序中所有運算和比較均考慮到了輸入前導(dǎo)0(例0001)的情況。由于數(shù)據(jù)類型限制,該程序未加入小數(shù)計算和負(fù)數(shù)計算。 2.2.3 技術(shù)約束 本程序已在code blocks下編譯通過。 2.3 總體設(shè)計 2.3.1 全局?jǐn)?shù)據(jù)結(jié)構(gòu) 本程序中數(shù)據(jù)采取以10000為單位存入整形數(shù)組,在數(shù)據(jù)計算和比較中對單個數(shù)組單元進(jìn)行操作。 2.3.2 函數(shù)設(shè)計 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ù)組大小的地址 實現(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ù)運算 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ù)組的首地址。 實現(xiàn)步驟:依次將所需計算的兩個數(shù)組及其位數(shù)的最大值傳入函數(shù),對兩個函數(shù)每一位進(jìn)行加法存入結(jié)果中,對滿10000的結(jié)果進(jìn)行進(jìn)位,然后對該位進(jìn)行對10000取余存入結(jié)果。 實現(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ù)組的首地址。 實現(xiàn)步驟:依次將所需計算的兩個數(shù)組及其位數(shù)的最大值傳入函數(shù),對兩個函數(shù)每一位進(jìn)行減法存入結(jié)果中,對減不著的進(jìn)行借位,然
26、后對該為進(jìn)行對十取余存入結(jié)果。 實現(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ù)組的首地址。 實現(xiàn)步驟:對兩個函數(shù)的每一位進(jìn)行乘法,然后對于大于10000的結(jié)果進(jìn)行進(jìn)位操作。由于該程序中所有數(shù)組均從1開始存,故運算結(jié)果從2開始存。 實現(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ù). 實現(xiàn)步驟:將未經(jīng)反轉(zhuǎn)的數(shù)組傳入,
29、從0開始做個操作,循環(huán)利用比較和減法,若余數(shù)大于除數(shù),則進(jìn)行減法調(diào)用,此處用到的減法為低位減法. C. 運算輔助函數(shù) 1.反轉(zhuǎn)整形數(shù)組InvertInt() 同上。 2.刪減多余的零Del_zero_str() 函數(shù)原型:void Del_zero_str (char *); 功能:從str[1]開始去零,結(jié)果為去零后的字符串;用于比較兩個數(shù)的大小時被調(diào)用。 3.獲取兩個數(shù)的最大值Get_MAX() 同上。 2.4 設(shè)計思想說明 該程序中所有大整型無符號數(shù)據(jù)的運算均采用模擬手算的方法,對單個四位數(shù)字進(jìn)行操作,以實現(xiàn)大整型運算。為程序運行更加高效,調(diào)
30、用函數(shù)過程中傳輸多個參數(shù),若將該程序作為模板,則可省略其中某些參數(shù),使調(diào)用更方便。 2.5 測試結(jié)果說明 主界面截圖 測試加法: 圖一 圖二 測試減法: 圖一 圖二 測試乘法: 圖一
31、 圖二 測試除法: 測試比較: 注:以上數(shù)據(jù)均為程序在Code Blocks 環(huán)境下的運行結(jié)果,且該結(jié)果都通過了驗證。 2.6完整代碼 詳見程序文件WanBigN.c。 三、性能比較 說明:該部分主要通過及時函數(shù)對兩個程序的性能進(jìn)行了比較,其中的計算時間為在純計算時間(不包含輸入用時)的基礎(chǔ)上,空循環(huán)10 的 8 次方次所測時間。只比較了加法和除法。下面截圖為多次測試后選取的截圖。 加法: 程序一: 程序二: 除法: 程序一: 程序二: 結(jié)論:
32、 通過多次比較,程序二優(yōu)于程序一,運行時間上略短,且運算支持?jǐn)?shù)據(jù)更大。 源碼: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Name: 無符號大整型數(shù)據(jù)運算和比較(1) * * Introduct: C語言程序設(shè)計基礎(chǔ)大作業(yè)
33、 * * Thought: 用模擬手算的算法對大整形無符號數(shù)據(jù)進(jìn)行基本計算和比較(‘+’,‘-’,‘*’,‘/’), * * 采用整形數(shù)組存儲,以 1 為單位進(jìn)行運算。 * * Date: 2010/12/29 * * * * *
34、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
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]對數(shù)組進(jìn)行比較,傳入兩個數(shù)組及其大小以及需要從第幾位開始比較 int BigN_cmp_High(int *, int *, int , int ); //從a[n]對數(shù)組進(jìn)行比較,傳入兩個數(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控制輸出時的最低位,因為num從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)//判斷兩個數(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ù)號
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;//零的個數(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個
}
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);//對mod低位去零
if(BigN_cmp_low(mod,num2,*bit_mod,bit2,1) > 0)//mod
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)后保健知識講座
- 《音樂小屋》課件2
- 2019屆高考物理二輪復(fù)習(xí)專題二能量與動量第7講動能定理的應(yīng)用課件
- 灝忓涓€騫寸駭鍥介槻鏁欒偛璇句歡
- 高中地理一輪二輪三輪復(fù)習(xí)氣象災(zāi)害集備1
- 人教英語必修二同課異構(gòu)課件:Unit2TheOlympicGamesSectionAWarmingUpandReading2
- 人教版小學(xué)語文二年級上冊《黃山奇石》PPT課件
- 6分?jǐn)?shù)混合運算(二)第1-課時課件
- 黃河的主人(教育精品)
- 術(shù)前肺功能測定及其臨床意義
- 變態(tài)心理學(xué)和健康心理學(xué)知識專題知識宣講
- 肝纖維化無創(chuàng)性診斷--課件
- 512垂線(1)(教育精品)
- 熒光幻彩金蔥粉耐溶劑金蔥粉
- 第4章音頻媒體2