大數運算 加減乘除

2021-08-14 09:51:57 字數 2201 閱讀 9553

大數運算產生的原因就是因為int,double型別表示範圍都有限,無法表示過長的數字比如:2345468454567865415467864453437。

因此也就無法進行四則運算,為了實現這種運算,大數運算產生了。

其實也很簡單,既然基本資料型別放不下這些資料,那就用陣列存放唄。

定義char c[100000000],總能放下這麼大的數了吧,當然因為這些數是用陣列儲存的,那麼對它們進行運算也就不能簡單的加減乘除了。只能通過模擬人工計算的方法來實現。

如果模擬人工的計算方法來計算除法,emm....怎麼模擬,貌似不太簡單。

所以除法就是將除法轉換為減法來運算。 例如計算6/2,可以轉換為計算6-2能減多少次,很顯然,能減三次,所以答案就出來了。為3。

廢話不多說 上**。

#include#include#define max(a,b) (a>b?a:b)

//比較兩個字串數值,前者大返回正數,相等返回0,前者小負數;

int compare(char *a,char *b)

else num1[i]+=num2[i];

for(flag=99999; num1[flag]==0; flag--);

for(int i=flag; i>=0; i--,j1++)//將結果轉回正序,且轉換回ascll碼

num[j1]='\0';

}void sub(char *a,char *b,char *num)//減法

,num2[100000]= ;

//如果a=0; i--,j++)

num1[i]=b[j]-48;

for(int i=strlen(a)-1,j=0; i>=0; i--,j++)

num2[i]=a[j]-48;

}else

for(int i=0; i0; flag--);

if(compare(a,b)<0)

num[j1]='-',j1++;

for(int i=flag; i>=0; i--,j1++)

num[j1]='\0';

}void mul(char *a,char *b,char *num)//乘法

; char num1[100000]= ,num2[100000]= ;

/* 逆序存放a,b 同加法*/

for(int i=strlen(a)-1,j=0; i>=0; i--,j++)

num1[i]=a[j]-48;

for(int i=strlen(b)-1,j=0; i>=0; i--,j++)

num2[i]=b[j]-48;

/*核心部分

*將已有result[i+j]與當前計算出的result[i+j]相加,並且和 進製

*計算當前result[i+j],並且記錄積進製,!!!!注意:積進製不能直接進製,要先記錄下,下次計算再進製。

*模擬人工乘法

*/for(int i=0; i9)

else

result[i+j]=result[i+j]+flag%10;

}for(flag=99999; result[flag]==0&&flag>0; flag--);

for(int i=flag; i>=0; i--,j1++)

num[j1]='\0';}/*

大數除法原理:反覆做減法,看從被除數裡面最多能減去多少個除數,商就是多少。

逐個減顯然太慢,要判斷一次最多能減少多少個整的10的n次方。

以7546除23為例。

先減去23的100倍,就是2300,可以減3次,餘下646。 此時商就是300;

然後646減去23的10倍,就是230,可以減2次,餘下186。此時商就是320;

然後186減去23,可以減8次,此時商就是328.

*/void div(char *a,char *b,char *num)//除法

,num2[100000]= ;

strcpy(num1,a);

int alength=strlen(a),blength=strlen(b);

int divalue=alength-blength;//兩個資料相差的位數

while(divalue>=0)

{int i=0;

strcpy(num2,b);

num2[blength+divalue]='\0'; //將b放大為與a位數相同

for( ;i=0) //a b相減 直到a

大數運算(加減乘除)

加法 void add char a,char b,char d for i len i 1 i if c i 48 len else break for i 0 i len i d i c len i view code 減法1 d2 d1,如果需要比較大小自己加乙個不麻煩。void dec ch...

大數運算 (加減乘除)

大數加減乘除應該都不陌生了吧,原來只寫過大數加法,弱弱的我重溫了一下這種,發現還是蠻有意思的。不知道有沒有感覺到,解決這類問題進製思路都挺簡單的,主要錯的地方就是最後細節的處理,前導0的去除,型別轉換等之類的問題。都是按整數輸入資料 沒有考慮小數點之類的輸入和負數的情況。大數加法 hdu1002 l...

大數運算之加減乘除

我們都知道計算機能夠儲存的各種型別數的大小是有限的,比如int型在32位的情況下範圍是從 2 31 2 31 1,那麼如果我們要計算的數非常的大,我們該如何做呢?那樣便需要運用到大數運算。大數運算本質上來說是模仿人們進行筆算時的操作,將人們筆算時的操作通過 來實現,從而達到實現大數執行的結果。c 如...