hdu 1018 Big Number
2016-04-07 00:14
417 查看
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
The output contains the number of digits in the factorial of the integers appearing in the input.
Sample Input
2 10 20
[align=left]Sample Output[/align]
7 19
题目的意思是给出一个数,让你求这个数阶乘的位数。
网上的大神给出的方法是,将n!表示成10的次幂,即n!=10^M(10的M次方,10^2是3位M+1就代表位数)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有M=log10^n!即: M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,该M是n!的精确位数。
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
The output contains the number of digits in the factorial of the integers appearing in the input.
Sample Input
2 10 20
[align=left]Sample Output[/align]
7 19
题目的意思是给出一个数,让你求这个数阶乘的位数。
网上的大神给出的方法是,将n!表示成10的次幂,即n!=10^M(10的M次方,10^2是3位M+1就代表位数)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有M=log10^n!即: M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,该M是n!的精确位数。
#include <cstdio> #include <cmath> int main() { int i, t, n; double sum; scanf("%d", &t); while (t--) { sum = 1; scanf("%d", &n); for (i = 1; i <= n; i++) sum += log10(i); printf("%d/n", (int)sum); } return 0; } 当数比较大的时候,可以利用斯特林公式: #include #include const double PI = 3.141592653589; int main() { int n, t; double sum; scanf("%d", &t); while (t--) { scanf("%d", &n); if (n == 0 || n == 1) { printf("1n"); continue; } sum = (n*log(n) - n + 0.5*log(2 * PI*n)) / log(10) + 1; printf("%dn", (int)sum); } return 0; }
相关文章推荐
- springMVC4(14)各类视图输出实例分析
- Java Monitoring Tools之jcmd
- javaSE_String
- return
- Intent 实现页面之间的跳转
- 反素数深度分析
- 如何实现一个spark数据源
- noip1997提高组 填数字
- iOS开发技巧--Git的使用
- 什么是Activity
- Volley使用方法
- 去掉CSDN博客右边讨厌的二维码浮层
- SDAU 搜索专题 17 非常可乐
- 补充四周总结
- 布局概述之帧布局FrameLayout和布局概述之表格布局TableLayout
- hihocoder 1290 -- 微软2016校园招聘4月在线笔试-3-Demo Day
- win10家庭版 遇到的问题
- python String
- 【转】关于几种访问GameObject方式的效率对比
- 多态和重载的区别