計算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 輸入包含若干
讀取超大Excel(39萬行數據)
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]基因匹配Match(DP + 樹狀數組)
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