大數的階乘
今天開始做做演算法的題目,在51NOD網站上。(本人是剛入手oj的小菜鳥)想以部落格形式記錄下自己的寫過的題目,加一總結。題目如下所示:
Input
輸入N(1 <= N <= 10000)
Output
輸出N的階乘
Input示例
5
Output示例
120
看到題目我一臉懵逼,自己腦海裡面最大的數就是long long 我以為就直接這樣寫就可以了就有了如下的程式碼:
#include<cstdio> int main() { int a; long long b; scanf("%d",&a); for(int i=1;i<=a;i++) { b*=i; } printf("%lld",b); }
然而結果卻不是我想要的正確。題目是小於10000的階乘遠遠大於long long 2的64次方,怎麼辦呢我想不到了,不知道如何處理於是我開始百度找到了別人的解法。
1. #include<cstdio> 2. #include<cstring> 3. #include<cmath> 4. #include<algorithm> 5. using namespace std; 6. 7. #define _MAX 100000000 8. long long a[10005]; 9. int main() 10. { 11. int i,j,n,m = 0; //m與切片有關,c與進位有關 12. long long c; //當C>0時,即代表進位 13. a[0] = 1; //不要忘記,0! = 1 14. scanf("%d",&n); 15. for(i=1; i<=n; i++) 16. { 17. c = 0; 18. for(j = 0; j<=m; j++) 19. { 20. a[j] = a[j] * i + c; 21. c = a[j] / _MAX; 22. a[j] = a[j] % _MAX; 23. } 24. if(c > 0) 25. { 26. m++; 27. a[m] = c; 28. } 29. } 30. printf("%lld",a[m]); //先輸出首位 31. for(i = m - 1; i>=0; i--) 32. { 33. printf("%08lld",a[i]); //不足指定寬度前面補零 34. } 35. 36. 37. 38. 39. 40. return 0; 41. }
剛開始看這個程式碼的時候我也不懂後來把從1加到10慢慢按照兩個for迴圈來筆算。就有了一點思路。
這個不就是和平時的10進位制的乘法是一樣的平時我們是一位一位的上面的程式碼是8位的。比如說16*6
就把這個16分開來分為10和6。首先6*6是36然後36/10=3是進位。36%10=6是個位的。然後1*6+3是十位的數。程式碼中的c就是進位,a【m】裡面放的就是下一個位的數。比如這個16*6是兩位就是m的值2,a【1】=9,a【0】=6;然後輸出就可以了。
第一次寫部落格,請大家多多指教。
相關推薦
斯特林(Stirling)公式 求大數階乘的位數
href put || tdi code const 但是 body https 我們知道整數n的位數的計算方法為:log10(n)+1n!=10^m故n!的位數為 m = log10(n!)+1 lgN!=lg1+lg2+lg3+lg4+lg5+...........
codewars--js--Large Factorials--階乘+大數階乘
ref 階乘 clas python count .cn exp pre n+1 問題描述: In mathematics, the factorial of integer n is written as n!. It is equal to the product of
codevs 1488 GangGang的煩惱 大數階乘
codevs 1488 GangGang的煩惱 大數階乘 傳送門:http://codevs.cn/problem/1488/ 使用大數階乘的模版即能A該題,原理不難理解,就是用陣列來儲存階乘的結果,主要就是按位進行處理,包括進位的處理
大數階乘——詳解講解
題目詳情:NYOJ-大數階乘 階乘相信大家都不陌生,簡單一點的迴圈遞迴都可以解決。 在這裡將要講解的
N! (n的階乘)(大數階乘)
Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Output
大數階乘or相乘
大數相乘或者階乘不能用傳統乘號直接來原因是乘出來數太大了,計算機記憶體受不了,比如12!為億級,100!有97位;程式設計界處理這類大數問題一般這麼處理: 如果現在要求:2746512,那麼乘的過程是: 對於個位:312=36,那麼可以斷定27465*12的個位數一定是6,所以我們把個
java大數階乘
//JAVA 大數階乘 import java.math.*; import java.util.Scanner; public class LargeNumber{ public sta
PTA_基礎程式設計題目集_6-10 階乘計算升級版 (20 分)“大數階乘”
題目地址 題目分析: 1.預估1000!的位數~~進行放大估計~~1000^900&100^100即是3*900+2*100+o<3000位; 2.這裡顯然需要利用陣列來儲存數字並進行運算,讓陣列成員每個儲存3位數字(題目條件已告知引數小於1000),我們構
大數階乘(藍橋杯)
/* 1000!的階乘有多少位數字?不知道,總之,十個long long也是不夠用的,所以考慮用陣列來模擬乘法運算,那麼陣列開多長合適呢?其實博主最開始開的2000,結果。。。提交上去只過了80%資料,顯然,2000位不夠,最後開了個3000的陣列直接AC了。那麼下面來說說模擬大數運算吧!!
88-大數階乘的模板
https://blog.csdn.net/huxiansheng__/article/details/80052081 #include<iostream> #include<cstdio> #include<cstring> int s[100000]={0};
大數階乘講解
1105: 求N的階乘 題目描述 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它? 輸入 輸入檔案第一行有一個整數n(1≤n≤50),以下n行每行有個整數k(k大於0小於5000)。 輸出 輸出檔案有n行,各包含一個結果。 樣例輸入
hdoj1018_Big Number(大數階乘位數)
題目大意:輸入1~10^7的數字,輸出其階乘結果的位數。 例如10->7 說說解題思路,說大數階乘,立馬想到的是用陣列存結果-_-隨即想到以前做的那道大數階乘數字沒有這麼大,而且也不知道10^7的階乘得開多大陣列,所以只覺得記憶體不夠,開不到這麼大陣列,同時忽略了更
大數階乘(JAVA)
小編初學Java,先解決一下大數問題,還請多多關注^-^ 描述 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它? 輸入 輸入一個整數m(0<m<=5000) 輸出 輸出m的階乘,並在輸出結束之後輸入一個換行符
Java利用BigInteger類求大數階乘運算
進行大數運算,用到BigInteger類,首先介紹一下這個類 方法 描述 public BigInteger (String var) 將一個字串變為BigInteger型別的資料 public BigInteger add(BigInteg
java競賽-大數階乘問題
Java計算階乘(n!)需要使用實現使用BigDecimal類,因為用int最多正確算到12!,用long最多正確算到20! 計算機中提供了長整型和雙精度等能儲存較大
大數運算(7)——大數階乘(求階乘)
對於大數來說,一個數的階乘是非常大的,同樣,一個int型別的整數,他的階乘就有可能會很大。 就拿50來說,他的階乘位數是65位,就已經遠遠超過了long long int型別的最大值。這時候,我們要通過字串的方法,來進行階乘的運算。 當然,需要注意的是: 我們所求一個數的階
Java 大數階乘簡單方法
import java.util.Scanner; public class nc030 { public static void main(String[] args) throws Exception { // TODO Auto-genera
HDU 1261 字串數(大數階乘 除法 組合 java)
生平第一次用java A題 這個題目明顯的一個全排列除以相同元素的排列數 import java.util.*; import java.math.*; public class Main { public static void main(St
杭電acm:大數階乘(附原始碼)
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N
js進行大數階乘的演算法
今天遇到的一個演算法題,讓計算階乘,發現原遞迴存在計算溢位的問題,於是找到了這個用陣列來替代遞迴演算法的函式。 個人理解:這個函式主要是將每一次的乘法精確到了位數,每次只計算階乘位數以內的乘法來防止計算溢位。 function f(n) { // a代表結果