【HDOJ1018】【大数阶乘位数】【斯特林公式】

http://acm.hdu.edu.cn/showproblem.php?pid=1018

Big Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41932    Accepted Submission(s): 20544

Problem Description

In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of digits in the factorial of the number.

Input

Input consists of several lines of integer numbers. The first line contains an integer n, which is the number of cases to be tested, followed by n lines, one integer 1 ≤ n ≤ 107 on each line.

Output

The output contains the number of digits in the factorial of the integers appearing in the input.

Sample Input

2
10
20

Sample Output

7
19

题目大意:求阶乘位数,数据很大。

题目分析:斯特林公式   X的阶乘位数==llog10(1)+log10(2)+···+long10(n)取整后加1

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 int main()
 6 {
 7     int t;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         int n;
12         double sum=1.0;
13         scanf("%d",&n);
14         for(double i = 1 ; i <= n ;i++)
15         {
16             sum+=log10(i);
17         }
18         cout << (long)sum << endl;
19     }
20     return 0;
21 }

原文地址:https://www.cnblogs.com/MekakuCityActor/p/9038282.html

时间: 2024-10-14 09:27:14

【HDOJ1018】【大数阶乘位数】【斯特林公式】的相关文章

nyoj___大数阶乘

http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 3041409320171337804361260816606476884437764156896

斯特林公式(计算大数阶乘)

#include <iostream> #include <cstdio> #include <cmath> #define PI 3.1415926535898 #define e 2.718281828459 using namespace std; ///斯特林 ///n!=sqrt(2*PI*n)*pow(n/e,n) int main() { int n;cin>>n; while(n--){ long long m; scanf("%l

大数阶乘的位数和精确值计算【转】

来源:http://www.cnblogs.com/stonehat/p/3603267.html 在此,顶礼膜拜一下原文作者呵呵 我们知道整数n的位数的计算方法为:log10(n)+1 故n!的位数为log10(n!)+1 如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解 斯特林(Stirling)公式: 于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1 即 1/2*l

AOJ 758.大数的位数

大数的位数 Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MBTotal Submission: 30   Submission Accepted: 9 Description 给出一个整数,确定这个数的阶乘的位数. Input 多组数据,每行为一个大于等于1且小于等于107的整数n. Output 对应每个输入数据输出一个结果. Sample Input Original Transformed 10 20

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

HDU 1042 N! (大数阶乘,还是Java大法好,C也不能错过!!!)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 73270    Accepted Submission(s): 21210 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in o

杭电acm:大数阶乘(附源码)

Problem 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 For each N, output N! in one line. Sample Input 1 2 3 Sample Output 1 2 6 #include <stdio.h> int main() {

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10

大数阶乘(c语言)

大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 int result[MAXN]; int main() { int i,j,n; scanf("%d",&n); // memset函数的作用将某一段内存设置成指定的值 // 参数1:内存首地址 参数2:指定的值 参数3:内存大小 memset(result,0,sizeof(