1. 程式人生 > >計算N!(陣列模擬超大數運算)

計算N!(陣列模擬超大數運算)

計算N!

Time Limit:1000MS Memory Limit:32768K

Description
yaojian最近學了一個新的運演算法則——階乘,但他很懶,不想一步一步計算,所以他想讓你來幫他編一個程式,能馬上得到N的階乘。

Input
輸入包含若干行資料,每行都有一個整數N(0<=N<=200)。

Output
與輸入相對應每行輸出N的階乘。

Sample Input
2
4

Sample Output
2
24

Source

這道題看起來很簡單,但其實存在一個很大的問題:200的階乘是很恐怖的375位數:

78865786736479050355236321393218506229513597768717326329474253324435944996340334
29203042840119846239041772121389196388302576427902426371050619266249528299311134
62857270763317237396988943922445621451664240254033291864131227428294853277524242
40757390324032125740557956866022603190417032406235170085879617892222278962370389
7374720000000000000000000000000000000000000000000000000

根本完全無法用任何基礎型別來儲存,因此可以使用陣列模擬超大數運算。下面是程式碼,因為N!比較簡單,就不作註釋,只為超大數運算部分添加註釋。

<span style="font-size:24px;">#include<iostream>
using namespace std;
int main(){
	int n;
	int a[201][101] = {0};
	a[0][1] = 1;
	for(int i = 1; i <= 200; ++i){
		int tmp = 0;	//用於儲存進位
		for(int j = 1; j < 100; ++j){
			a[i][j] = a[i - 1][j] * i + tmp;	//先做乘法,再加上進位
			tmp = a[i][j] / 10000;	//超過四位的部分儲存出來,用於進位
			a[i][j] %= 10000;	//每一位陣列只保留四位數字
		}
	}
	while(scanf("%d", &n) != EOF){
		int k = 100;
		while(!a[n][k--]);	//排除前面為空的陣列
		printf("%d", a[n][k + 1]);	//輸出結果的前四位
		for(; k > 0; --k){
			printf("%04d", a[n][k]);	//輸出其餘的所有四位數字,若數字小於四位,則前面用0填充
		}
		printf("\n");
	}
	return 0;
}</span>

相關推薦

計算N陣列模擬超大運算

計算N! Time Limit:1000MS Memory Limit:32768K Description yaojian最近學了一個新的運演算法則——階乘,但他很懶,不想一步一步計算,所以他想讓你來幫他編一個程式,能馬上得到N的階乘。 Input 輸入包含若干

讀取超大Excel39萬行

display dll rate splay es2017 bsp exce 利用 必須 有個學長需要處理Excel數據,Excel數據共有39W,將數據讀取後處理並導出數據。最開始嘗試了 NPOI ,發現NPOI 並不能完成該項任務,隨後嘗試引用的com組件:M

HDU 1395 2^x mod n = 1 歐拉函

ear val clu pro ava http align 歐拉 similar 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other

P1160 佇列安排陣列模擬連結串列

題目描述 一個學校里老師要將班上N個同學排成一列,同學被編號為1~N,他採取如下的方法: 1.先將1號同學安排進佇列,這時佇列中只有他一個人; 2.2~N號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1~i -1中某位同學(即之前已經

字典樹原理模板陣列模擬VS指標+例題

2.從字串開始下標到結束(0-len)我們依次將字元做出節點。方法是:將字母s[i]由字典序化為數字id,當指標P指向的下一個next[id]為空時,將其單詞計數初始化為0,從0-maxn初始化P指向的所有節點為NULL(一棵字典樹很明顯有很多棵子樹),同時修改指標P指向next[id],如果要統計字首,將計

N高精度

問題描述: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:For

1007. 二哥領工資 超大求和

題目描述 二哥當了多年的助教,今天終於要發工資了!二哥正在高興之際,得知工資是分兩部分發放的。第一部分是這學期的工資,另一部分是之前所有學期的工資總和。而領取工資時,出納員會問二哥,兩部分工資加在一起是多少,如果二哥回答錯了,就只能領到這個學期的工資之前所有學期

給定一個數組,陣列中有正有負,求出連續陣列中和值最大的陣列長度大於等於1

刷牛牛客遇到的題,想給出完整而又簡潔的function(python解答,但是關鍵是思想,語言不是問題啦)1.給定一個數組,陣列中有正有負,求出連續(全部都是正的時候,所有值累加就是最大值)(全部為負的時候,max(array)就是我們想要的)# -*- coding:utf

1177:計算N

1177:計算N! Description 你的好友小王最近學了一個新的運演算法則-----階乘,但他很懶,不想一步一步計算,早知道你是一個程式設計師高手,所以他想讓你來幫他編一個程式,能馬上得到N的階乘。 Input 輸入包含若干行資料,每行都有一個整數N(0&l

計算n的位數

/* log10(12*13)=log10(12)+log10(13)=2 */ #include<stdio.h> #include<math.h> int main() {     int zushu,n,i;     double  sum;

輸入不超過10000的正整數,計算n的具體值。

輸入:輸入有若干組,每組資料包含一個整數n(n<=10000)。 輸出:n!的具體值。 程式碼如下: #include<iostream> #include<cstring> using namespace std; int main(){

HDU 1047(大數相加)陣列模擬

  這個題目啊,其實紮實的做的話應該並不難,然而我想看是統一用字串,還是再轉化成陣列,然後看了別人的題解,傻冒一樣的像別人一樣謝了getchar();真是傻冒了,我用的scanf("%s",str),

hdoj 1002 sum problem超大相加

思路:因為是超大數,所以要用字元陣列進行儲存,並且在陣列的基礎上進行計算 程式碼如下: #include <stdio.h> #include <stdlib.h> #inc

實驗三:分別用for,while;do-while循壞語句以及遞歸的方法計算n,並輸出算式。

分享圖片 return 方法 gui rgs class ima n! 用法 源代碼: package jiecheng;import java.util.Scanner;public class JieCheng { public st

實驗三:分別用for、while和do-while循環語句以及遞歸方法計算n,並輸出算式

scanner bsp ret while 循環語句 rda font ips == 實驗三:分別用for、while和do-while循環語句以及遞歸方法計算n!,並輸出算式 //用for循環語句求n! Public class jiecheng { Public

[BZOJ1264][AHOI2006]基因匹配MatchDP + 樹狀

return scanf namespace onclick ring splay urn ret int 傳送門 有點類似LCS,可以把 a[i] 在 b 串中的位置用一個鏈式前向星串起來,由於鏈式前向星是從後往前遍歷,所以可以直接搞。 狀態轉移方程 f[i]

Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum離線樹狀

turn string 之前 algorithm printf ace r++ void contest http://codeforces.com/contest/703/problem/D 題意: 給出一行數,有m次查詢,每次查詢輸出區間內出現次數為偶數次的數字的異

Chapter six Linked List & Array鏈表與

play str right 分享 經典 integer 頭指針 ted lin 1.reverse-nodes-in-k-group(k組翻轉鏈表)【hard】 給你一個鏈表以及一個k,將這個鏈表從頭指針開始每k個翻轉一下。鏈表元素個數不是k的倍數,最後剩余的不用翻轉。

據的最大值問題重載+函模板

tarray 模板 浮點型 namespace date類型 最大值 實現類 sin pre 兩個類如下設計:類time有三個數據成員,hh,mm,ss,分別代表時,分和秒,並有若幹構造函數和一個重載-(減號)的成員函數。類date有三個數據成員,year,month,da

YYH的王國NOIP模擬賽Round 6

%d int clu org space std n) https ble 原題傳送門 好吧,這道題還是結論題, 我們很容易就發現如果所以點都向1連邊,那麽答案一定最優。 所以我們只要計算2+3+4+5+...+n即可。 記住!不要智障地用for循環! 等差數列!! #i