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

2021-06-22 13:04:01 字數 1982 閱讀 1051

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

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

階乘問題比較典型,下面,將通過自己的學習逐步介紹。

首先介紹兩種常規方法。

[cpp]view plain

copy

/* 利用 迭代 來計算整數n的階乘 */

#include 

intmain()  

printf("%ld"

,result);  

return

0;  

}  

[cpp]view plain

copy

/* 利用 遞迴 來計算整數n的階乘 */

#include 

long

factorial_recursion( 

intn )  

else

}  intmain()    

這兩種方法都比較常規,也比較簡單,初學c的時候,還沒接觸演算法,就是利用這樣的思路完成。

但是,一旦求n!中n的值大了,那麼不管是int 還是 long 都無法滿足。這時候就涉及到大數處理的問題上了。

下面介紹常規的大數階乘。

[cpp]view plain

copy

#include 

intmain()  

while

(carry)  

}  printf("n ! = "

);    

//顯示結果

for(j = digit; j >=1;j--)  

printf("\n"

);  

return

0;  

}  

這種大數階乘演算法也比較常規,目前水平能看懂。 

具體思路**中的注釋也比較詳細,就不重複了。  還是模擬筆算的過程。

下面附帶兩個大牛的演算法 , 雖然現在還看不懂,但是先mark一下。以後慢慢琢磨。

出處 :  

[cpp]view plain

copy

#define n 400

long

a[8916]=,n,i,c,len;   

intmain(

void

)    

((a[i]=c)>0)?len++:0;   

}      

for( len--,printf(

"%d"

,a[len--]);len>=0; len--) printf(

"%04d"

,a[len]);   

return

0;   

}  

【解釋】

for ( len=1;n>1; n--)     //把len的長度初始為1,因為陣列中已經有乙個元素了a[0]=1

((a[i]=c)>0)?len++:0;  //最後乙個元素也有進製嗎,有的話就在當前的元素的下個陣列位置直接等於進製值,並

// 且陣列的元素值 要加1,沒有的話什麼都不幹 ,光乙個0什麼都不是

}出處:

[cpp]view plain

copy

inta[100000]=,n,i,c,m=1;  

main()  

for(;m;)  

putch(a[--m]+48);  

}  

另外,網上關於大數階乘的討論也比較多。我也google了一些,學習後,感覺下面幾個比較有意義。

還是先mark下。 便於以後溫習。

高精度大資料 階乘計算

問題描述 輸入乙個正整數n,輸出n 的值。其中n 123 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的...

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

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

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

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