大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。
一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。
百位大數...讓人又愛又恨阿。 回想去年,初學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 大數,高精度計算 大數階乘
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。階乘問題比較典型,...