大數的運算

2021-07-11 23:15:23 字數 3540 閱讀 6845

大數運算指的是對c語言中那些大到超出表示範圍的數的運算,比如9999999999999999999999999999999+9999999999999999999999999。c語言中無法將這麼大的乙個數儲存到變數中,這裡就要用到大數的運算了。

大數加法:

思路很簡單,就是把這個「大數」以字串的形式存入陣列中,然後倒序放入整型陣列便於逐步相加。附上**如下

void add(char*num1, char*num2)

; int intnum2[max] = ;

int i = 0, j = 0;

int len1 = strlen(num1);

int len2 = strlen(num2);

int len = len1 > len2 ? len1 : len2;

for (i = len1 - 1; i >= 0; i--)//將數字逆序存入整型陣列中,便於相加

j = 0;

i = 0;

for (i = len2 - 1; i >= 0; i--)

for (i = 0; i < len+1; i++)//逐步相加

}for (i = len; i >= 0; i--)

}

大數減法:

減法的思路和加法類似。也是將倆數存入到字元陣列中,然後倒序放入整型陣列便於逐步相減。但區別於加法的一點是減法需要事先判斷好那個數字比較大,由較大數減去較小數。最後輸出的時候要注意正負號,**如下:

void sub(char*num1, char*num2)

; int intnum2[max] = ;

int i = 0, j = 0;

int len1 = strlen(num1);

int len2 = strlen(num2);

int len = len1 > len2 ? len1 : len2;

/*判斷哪個數比較大*/

char*biggersize = judgesize(num1, num2);

for (i = len1 - 1; i >= 0; i--)//倒序存入整型陣列中

j = 0;

i = 0;

for (i = len2 - 1; i >= 0; i--)

if (biggersize==num1)

for (i = 0; i < len; i++)//逐步相減

}else

for (i = 0; i < len; i++)

}if (biggersize==num1)

}else

}}

大數的乘法:

相對於前兩者,乘法稍微複雜一些。乘法的實現主要基於加法:把乙個乘數每位上的數取下來分別與另乙個數相乘(這裡要注意相乘的結果的大小,比如把十位上的數取下來與另一乘數進行運算,要記得在後面補上乙個0),然後把相乘的結果加起來就是結果。

**如下:

void mul(char*num1, char*num2)

; int intnum2[max] = ;

int pt[max] = ;

int num[max] = ;

int i = 0, j = 0, k = 0, t = 0;

int tenpos = 0;//倆個位數相乘的值得十位上的數

int len1 = strlen(num1);

int len2 = strlen(num2);

for (i = len1 - 1; i >= 0; i--)

j = 0;

i = 0;

for (i = len2 - 1; i >= 0; i--)

for (i = 0; i < len2; i++)//取intnum2上的每位來相乘

}/*相乘的結果進行加法運算(大數加法)*/

for (k = 0; k < len1+t+1; k++)

}t++;

memset(pt, 0, sizeof(int)*len1);

}for (i = max - 1; i >= 0;i--)//尋找相乘結果的第一位數

if (num[i] != 0)

for (i = j; i >= 0;i--)

printf("%d", num[i]);

}

大數除法:

思路很簡單,但是實現起來很複雜。這裡通過例子來說明:

假設a=,b=,結果result=:

先取a[0]a[1]即24,減去b一次,得a=,result=;

再取a[1]a[2]即12,發現它小於b,則多取一位,取a[1]a[2]a[3]即123,減b五次,得a=,result=;

再取a[3]a[4]即81,減b三次,得a=,result=。

/*比較除數與被除數上相應位的大小*/

int judgedivisorsize(int*num1, int*num2,int lendivisor,int t)

return

1;//相等的時候返回1

}void div(char*num1, char*num2)

; int intnum2[max] = ;

char result[max] = ;//記錄商的陣列

int i = 0, j = 0, k = 0, t = 0;

int len1 = strlen(num1);

int len2 = strlen(num2);

int lenresult = 0;

if (num2 == judgesize(num1, num2))

for (i = 0; i < len1 ; i++)

for (i = 0; i < len2; i++)

for (i = 0; i <= len1 - len2; i++)

/*當上一輪的首位為0的時候要即使調整,便於正確判斷本輪比較的數的大小*/

if (intnum1[i - 1] == 0)

t = 0;

}result[len2 + i - 1]++;

}/*當一輪比較結束,例如24563/13,24減去13餘下11,不夠減,intnum1首位的1要留到下一輪去比較,設定t為1*/

/*當intnum1首位為0的時候,並不需要留到下一輪*/

for (k = i; k < len2 + i; k++)

}else

}printf("商=");

lenresult = result[len1 - 1] == 0 ? len1 - 1 : len1;

for (i = 0; i < lenresult; i++)

printf("%s\n餘數=", result);

j = 0;

for (i = len1 - len2; i < len1; i++)

}for (i = j; i < len1; i++)

printf("%d", intnum1[i]);

printf("\n");

}

大數的運算

原理在 的注釋裡。include include include intcompare char a,char b 編寫函式比較兩個大數大小。a b返回1,a b返回0,a return0 void add char a,char b,char c 實現兩個大數相加 a1 i 0 i if l 0 ...

大數的基本運算 大數乘法

大數 即超過了計算機定義型別的範圍的數,如126349678984 1321656546446546546546,這種運算的結果 太大,超過了基本型別的範圍,發生溢位,這樣我們就需要運用大數的演算法來解決這個問題了。大數乘法 大數乘法 include include using namespace ...

大數的運算思想

大數計算的因數和結果精度一般是少則數十位,多則幾萬位。在c c 語言中定義的型別中精度最多只有二十多位,因而我們採取用鍊錶存貯的方式來存放大數。在計算中會用到從高位開始計算,和從低位開始計算數值的兩種情況。所以我們將鍊錶定義為雙向鍊錶,其中為乙個單元來存貯資料,乙個指標指向前方的資料,另乙個指向後的...