大數,高精度計算 百位大數

2021-09-06 11:23:43 字數 4544 閱讀 7967

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。

一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。

百位大數...讓人又愛又恨阿。  回想去年,初學c語言,實驗就有這個。

那時候折騰老久了。            刻苦銘心呀。

寫這篇部落格,沒其他意思,主要是為了回憶回憶,然後記錄一下當初的**,便於以後翻看。

**是大一上學期寫的。可能比較水,大神們勿噴,純屬自己娛樂罷了。

實驗題目:

此次實驗要求利用陣列實現兩個百位大數(共有100位數字)的加、減、乘法的運算。

實現下列三個函式的功能(以下函式應在fun.h中宣告,在fun.c中實現)

函式原型:

/*實現兩個大數的相加*/

char* add(char* data, char* addend, char* result);

/*實現兩個大數的相減*/

char* minus(char* data, char* sub, char* result);

/*實現兩個大數的相乘*/

char* multiply(char* data, char* mult, char* result);

實驗內容:

在給出的程式框架中完成實驗題目。

mylib.c包括此次實驗的程式框架。

(在給出的程式框架中補充設計並完成實驗。)

注:檢驗計算結果是否正確可利用提供的 test.exe 檔案。

在mylib.exe和test.exe檔案中輸入相同的種子則會產生相同的隨機大數。可以用test.exe產生的結果和mylib.exe對照結果檢驗對錯。

請注意其中test.exe檔案的輸出格式和框架規定的輸出格式有所不同。

字元型與整型轉換

1.可以模擬筆算加減乘的過程,用陣列儲存大數;

2.可以用atoi和itoa函式;

3.對於一位整數的整型轉換為字元型:

例:char c;

int i = 9;

c = i+』0』;

printf(「%c」, c);

/* 姓名:****

班級:軟體三班

學號:****

功能:百位大數

#include #include #include #include "fun.h"

#define n 100

/* 產生隨機的大數 */

void create(char* num, unsigned seed); /*seed 為隨機種子*/

char result[2 * n] = ;

int main(void)

void create(char num, unsigned seed)

while(flag)//避免高位為零

}num[i] = x + '0';

i++;

for(; i < times; i++)

num[times] = '\0';

}

#ifndef fun_h_included

#define fun_h_included

//此方法實現加法運算

char* add(char* data, char* addend, char* result);

//此方法實現減法運算

char* minus(char* data, char* sub, char* result);

//此方法實現乘法運算

char* multiply(char* data, char* mult, char* result);

#endif // fun_h_included

#include#include#include"fun.h"

#include#define n 100

//在此新增加法的實現

char* add(char* data, char* addend, char* result)

; char padden[2*n]=;//定義兩個char型別的字元陣列,並初始化每一位都置為'\0'

a1=strlen(data);

a2=strlen(addend);//統計兩個陣列中字串長度

strcpy(pdata,data);//將字串data複製到字元陣列pdata[n]中

strcpy(padden,addend);//將字串addend複製到字元陣列padden[n]中

for(i=0;result!='\0'&&i<2*n;i++)//將字元陣列result[2*n]初始化每一位都置為'\0'

if(pdata[0]!='-'&&padden[0]!='-')//當兩個數均為正整數時

}for(;a1>=1;a1--)//第乙個數比第二個數多餘的位數和'0'相加得到的結果

}if(result[0]>'9')//當result中第一位》'9',要進行進製操作

result[1]-=10;

result[0]='1';//首位進製加'1'}}

else if(a1b2)//第乙個數字數大於第二個數時

}p=b1;

while (pdata[p-1]<'0'&&p>1)//當兩個對應數相減小於'0'時,要位處理

if(b1>1)//第乙個數比第二個數多餘的位數和'0'相減得到的結果全部賦給result

}while (result[0]=='0')//當移位相減後首位為'0'時}}

else if(b1 < b2)//第乙個數字數大於第二個數時

else//第乙個數字數等於第二個數時

dif=i;//如果不相等下標digit設為i

}else

if(pdata[dif]>psub[dif])//當第乙個陣列中元素對應數值大於相同位的第二個陣列中的元素

}while (result[0]=='0')//當兩個陣列第一位數值相同,減去得到的結果為0}}

else if(pdata[dif] < psub[dif])//當第乙個陣列中元素對應數值小於相同位的第二個陣列中的元素

pdata[0] = '-';//相當於乙個乙個正數和乙個負數做加法

add(psub,&pdata[1],&result[1]);//呼叫加法函式add()

}else//當第乙個陣列中元素對應數值等於相同位的第二個陣列中的元素}}

else if(pdata[0]=='-'&&psub[0]!='-')//當第乙個為負,第二個為正時,可以看做乙個負數和乙個正數做加法,呼叫加法函式add()

else if(pdata[0]!='-'&&psub[0]=='-')//當第乙個為正,第二個為負時,可以看做乙個正數和乙個負數做加法,呼叫加法函式add()

else

return result;

}//在此新增乘法的實現

char *multiply(char* data, char* mult, char* result)

; char pmult[n]=;//定義兩個char型別的字元陣列,並初始化每一位都置為'\0'

char array[2*n]=;//定義乙個陣列array,用來存放第二個數每位相乘第乙個數得到的結果

strcpy(pdata,data);//將字串data複製到字元陣列pdata[n]中

strcpy(pmult,mult);//將字串mult複製到字元陣列pmult[n]中

c1=strlen(data);

c2=strlen(mult);//統計兩個陣列中字串長度

for(i=0;result[i]!='\0'&&i<2*n;i++)//將字元陣列result[2*n]初始化每一位都置為'\0'

if(pdata[0]!='-'&&pmult[0]!='-')//當相乘的兩個數均為正整數時

for(;num>0;num--)//mult陣列中每一位對應數值數,相應array中元素要乘以相同倍數,可以通過連續加法來實現

c3=strlen(array);//重新統計新得到的陣列array中字串長度

for(;digit>0;digit--)

add(array,result,result);//需將array中的元素錯位累加即可得到最終相乘的結果}}

}else if(pdata[0]=='-'&&pmult[0]!='-')//當第乙個為負,第二個為正時,相乘結果第一位必為'-',再呼叫函式multiply

else if(pdata[0]!='-'&&pmult[0]=='-')//當第乙個為正,第二個為負時,相乘結果第一位必為'-',再呼叫函式multiply

else if(pdata[0]=='-'&&pmult[0]=='-')//當兩個數均為負整數時,相當於兩個正整數相乘,呼叫函式multiply

return result;

}

4 大數,高精度計算 大數加法

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。思路很常規。先用字...

6 大數,高精度計算 大數乘法

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。大數乘法,相對之前...

9 大數,高精度計算 大數階乘

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。階乘問題比較典型,...