hdu1018——Big Number(大数阶乘,斯特林公式)
2016-04-02 10:06
417 查看
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
n的位数=log10(n)+1,m=n!,=log10^1+log10^2+...+log10^n
Stirling公式:n!与√(2πn) * n^n * e^(-n)的值十分接近
故log10(n!) = log(n!) / log(10) = ( n*log(n) - n + 0.5*log(2*π*n))/log(n);
#include <stdio.h>
#include <math.h>
const double PI = acos(-1.0);
const double ln_10 = log(10.0);
double reback(int N)
{
return ceil((N*log(double(N))-N+0.5*log(2.0*N*PI))/ln_10);
}
int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
if(n<=1)printf("1\n");
else printf("%.0lf\n",reback(n));
}
return 0;
}
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
n的位数=log10(n)+1,m=n!,=log10^1+log10^2+...+log10^n
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int main() { int n,m,i,ans; double t; scanf("%d",&n); while(n--) { scanf("%d",&m); t=0; for(i=2;i<=m;++i) t+=log10(i*1.0); ans=int(t)+1; cout<<ans<<endl; } return 0; }
Stirling公式:n!与√(2πn) * n^n * e^(-n)的值十分接近
故log10(n!) = log(n!) / log(10) = ( n*log(n) - n + 0.5*log(2*π*n))/log(n);
#include <stdio.h>
#include <math.h>
const double PI = acos(-1.0);
const double ln_10 = log(10.0);
double reback(int N)
{
return ceil((N*log(double(N))-N+0.5*log(2.0*N*PI))/ln_10);
}
int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
if(n<=1)printf("1\n");
else printf("%.0lf\n",reback(n));
}
return 0;
}
相关文章推荐
- 初学者 Vi 备忘单
- 蓝桥杯 蚂蚁感冒
- phpcms 手机站搭建
- 基于Zimbra搭建的邮箱服务器
- 任务管理器中的PID找不到
- 任务管理器中的PID找不到
- SparkContext初始化的核心过程
- ServletAPI --- ServletContext接口
- bootstrap学习以及其插件
- java缓存基本原理
- 【笔试/面试】—— 奇葩 C/C++ 语法题
- <C#入门经典>学习笔记2之控制流程
- spring常用的工具类
- 6.2 Android Framework - ShapeDrawable
- 22. Generate Parentheses 回溯算法
- 多表连接查询(内,外,交叉连接)
- Windows平台下登陆Oracle出现ORA-01031错误解决办法
- webservice的两种调用方式
- (OK) 编译batman-adv.ko—成功—android—cm11源码—下载
- 一步一步写算法(之排序二叉树)