1. 程式人生 > >大數的階乘

大數的階乘

         今天開始做做演算法的題目,在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代表結果