hdu_1018(斯大林公式/n!的位数)

题意:求大数n!的位数。

根据n! = (int)log(n!)+1

方法1:

log(n!) = log(1*2*3*...*n) = log1+log2+...+logn

方法2:

斯大林公式:

n! = sqrt(2*PI*n)*(n/e)^n

两侧取对数有

log10(n!) = 1/2log(2*PI*n) + n*log(n/e)

code1:

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

code2:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #define e 2.71828182
 5 #define PI acos(-1)
 6 int main()
 7 {
 8     int t;
 9     int n;
10     double w;             //斯特林数
11     scanf("%d",&t);
12     while(t--)
13     {
14         scanf("%d",&n);
15         w=(1.0/2*log10(2*PI*n)+n*log10(n/e));
16         printf("%d\n",(int) w+1);              //记得+1,不能少。
17     }
18     return 0;
19 }

时间: 2024-11-09 21:30:52

hdu_1018(斯大林公式/n!的位数)的相关文章

BZOJ 3000(Big Number-Stirling公式求n!近似值)

3000: Big Number Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 220  Solved: 62 [Submit][Status] Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数--N,K Output 每行一个数为输出结果. Sample Input 2 5 2 10 10 10 100 200 Sample Output 1 1 7 69 对

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

sicily 2011. Nine Digits(广搜,康托展开)

2011. Nine Digits Constraints Time Limit: 2 secs, Memory Limit: 256 MB Description Nine tiles, each with a number from 1 to 9 on it, are packed into a 3 by 3 frame. Your task is to arrange the tiles so that they are ordered as: 1 2 3 4 5 6 7 8 9 At e

bzoj3000 Big Number 数论,斯特林公式

Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数——N,K Output 每行一个数为输出结果 Sample Input 2 52 1010 10100 200 Sample Output 11769对于100%的数据,有2≤N≤2^31, 2≤K≤200,数据组数T≤200. 题解 用Stirling公式求近似值 位数=logk(n!)+1 ≍ logk(sqrt(2πn)*(n/e)^n)+1 = logk

提升营业额的正确方法

怎样才能让一个酒店赚钱?说起来其实很简单:一方面提高营业额;一方面降低各种成本,它们的差距越大,赚钱越多. 怎样提升营业额呢?首先我们要清楚是什么决定了营业额. 在财务上我们有这样一个公式: 座位数*座位周转率*人均消费水平=营业额 情况一:我们现有的座位数是:322个,假设人均消费60元,则: A.上午有70%的座位被利用:322*70% *60=13524;下午有90%的座位被利用:322*90%*60=17388;合计30912元. B.如果午餐和晚餐全满则:322*100%*2*60=3

求某个数的位数公式

1. 公式:   位数 = (int)lg10(A) + 1. 2. 推导: A 代表某个整数. 这里只考虑正整数(负整数规律一样). 10^(x-1) <= A < 10^x  (想一想 100, 999和1000 ) lg10(A) >= x - 1 lg10(A) + 1 >= x (int)lg10(A)+ 1 = x; A的位数便求出来了!

51nod 1058 N的阶乘的长度 位数公式

1058 N的阶乘的长度基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3.Input输入N(1 <= N <= 10^6)Output输出N的阶乘的长度Input示例6Output示例3思路:位数公式 则有: 循环遍历即可 代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 ios::s

HDU 1018 -- Big Number (Stirling公式求n!的位数)

题目链接: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): 40551    Accepted Submission(s): 19817 Problem Description In many applications ver

用python实现计算1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))类似的公式计算

作业需求: 开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 上图是实现的逻辑思路图,下面是对上图的分析: 整体的思想就是先匹配最