[原]NYOJ-数的位数-69
/* NYOJ69 阶乘数位长度
http://acm.nyist.net/JudgeOnline/problem.php?pid=69
数的长度
时间限制:3000 ms | 内存限制:65535 KB
难度:1
描述
N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?
输入
首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
输出
对于每个数N,输出N!的(十进制)位数。
样例输入
3
1
3
32000样例输出
1
1
130271
来源
ACM教程
上传者
rooot
* 方法一:
*可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对
该式两边取对数,有 M =log10^n! 即:M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,
该M是n!的精确位数。当n比较大的时候,这种方法方法需要花费很多的时间。
方法二:
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
.
有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,有兴趣的话可看这里。
这种方法速度很快就可以得到结果。详细证明如下:
http://episte.math.ntu.edu.tw/articles/mm/mm_17_2_05/index.html
14.
*/
//c语言版
#include <stdio.h>
#include <math.h>
int main()
{
int n,cas,i;
double sum;
scanf("%d",&cas);
while (cas--)//n!≈√2πn { (n/e)^n }
{
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
sum+=log10((double)i);
printf("%d\n",(int)sum);
}
return 0;
}
//C++版
/*
#include<iostream>
#include <cmath>
using namespace std;
int normal(double n){
double x=0;
while(n){
x +=log10(n);
n--;
}
return (int)x+1;
}
long stirling(double n){
long x=0;
if( n ==1 )
x = 1;
else{ x = (long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
}
return x;
}
int main()
{int n;
cin>>n;//c++中输入一个数
while(n--){
int x;
cin>>x;
cout<<stirling(x)<<endl;//c++中输出一个数
}
return 0;
}
*/
[原]NYOJ-数的位数-69的更多相关文章
- java实现:将一个数各个位数相加
前面已经实现过这个程序,现在我们就不多说了,直接更改C的源码,实现这个JAVA程序. import java.util.Scanner; public class HelloWorld { publi ...
- 利用C语言判别输入数的位数并正逆序输出
利用C语言判别用户输入数的位数并正逆序输出 #include <stdio.h> void main() { int i, scanfNum, printfNum, temp ...
- nyoj 69-数的长度 (log10(),计算数的位数)
69-数的长度 内存限制:64MB 时间限制:3000ms 特判: No 通过数:10 提交数:13 难度:1 题目描述: N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)····· ...
- nyoj 96 n-1位数(处理前导 0 的情况)
n-1位数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则 ...
- nyoj 数的长度
描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<1 ...
- NYOJ——————数的长度(斯特林公式的应用)
数的长度 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出 ...
- nefu26(求数的位数)
Description 根据密码学需要,要计算某些数的阶乘的位数. Input 第一行为整数n ,接下来 n 行, 每行1个数m (1 ≤ m ≤ 10^7) . Output 输出m的阶乘的位数. ...
- nyoj 96 n-1位数(处理前导 0 的情况)(string)
n-1位数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则 ...
- HDU 1018 阶乘数的位数
题目大意: 将一个数开阶乘后得到的值,来求这个值的位数 n! = 1*2*3*4...*n 对于求一个数的位数的方法为ans = lg(n!) + 1 那么就可以看作 ans = lg(1) + lg ...
随机推荐
- Matrix4x4矩阵 api
Matrix4x4 矩阵api介绍 Namespace: UnityEngine Description 描述 A standard 4×4 transformation matrix. 一个标准的4 ...
- Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php / * | --------- ...
- js父页面和子页面之间传值
今天和朋友一块讨论,怎样通过js在父页面和子页面之间传值的问题,总结例如以下: 需求描写叙述:父页面有多个子页面.实如今父页面点击子页面,传值到子页面. 看着非常easy,试了好久.主要纠结在怎样获取 ...
- iOS 开发之RunLoop
概念 RunLoop 就像她的名字一样,就是跑环,就是一个死循环.是一个可以随时休眠,随时唤醒的死循环. 那么一个手机App为什么会一直运行?而且在接受到用户点击的时候,会做出反应?这些都离不开Run ...
- IO密集型操作时,为什么线程比进程更好?
在IO密集型的操作时,进程线程都不会太占用CPU,但是进程消耗的资源比较多.
- 私有云的迁移:从VMware到OpenStack
VMware和OpenStack经常被描述为相互竞争的两种私有云技术.虽然这两种技术其实可以互补,但一些组织却选择从VMware迁移到OpenStack的私有云上. 让我们来看看这些组织如何能同时使用 ...
- jQuery设计理念
jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1. ...
- HDU - 1134 Game of Connections 【DP】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1134 题意 给出一个n 然后有2n个点 给两个点连一条边,最后连N条边,要求所有的边不能够交叉 问最多 ...
- 【Flask】下载多个文件
使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...
- inline-block元素的4px空白间距解决方案
http://www.jb51.net/css/68785.html inline-block元素的4px空白间距解决方案