[51nod1058]求N!的长度

法1:stirling公式近似

$n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$

(如果怕n不够大下式不成立,可以当数小于10000时用for求阶层)

也可以用log10函数,不过直接使用log,e没有误差,一定注意longlong;

复杂度$O(1)$

 1 #include<bits/stdc++.h>
 2 #define PI  acos(-1.0)
 3 using namespace std;
 4 typedef long long ll;
 5 int main(){
 6     int n,t;
 7     cin>>t;
 8     double ans;
 9     while(t--){
10         cin>>n;
11         ans=(0.5*log(2*PI*n)+n*log(n)-n)/log(10);
12         cout<<(ll)ans+1<<endl;
13     }
14     return 0;
15 }

法二:

直接for+log10循环求,复杂度$O(n)$

 1 #include<bits/stdc++.h>
 2 #define PI  acos(-1.0)
 3 using namespace std;
 4 typedef long long ll;
 5 int main(){
 6     int n;
 7     cin>>n;
 8     double ans=1.0;//对10取对数之后需要+1
 9     for(int i=1;i<=n;i++){
10         ans+=log10(i);
11     }
12     cout<<(int)ans<<endl;
13     return 0;
14 }
时间: 2024-11-06 08:01:41

[51nod1058]求N!的长度的相关文章

poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the

笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数

笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数. 函数接口声明如下:int my_strlen(const char *p); strlen函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'. 而返回的长度大小不包括'\0'. #include <stdio.h> #include <assert.h> //使用中间变量 //int my_strlen(const  char *str) //{ //   ass

bfs:求最短路径的长度

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

程序猿之---C语言细节17(求time_t的最大值、strlen求的是长度、malloc分配字符内存细节、switch的中default细节)

主要内容:求time_t的最大值.strlen求的是长度.malloc分配字符内存细节.switch的中default细节 #include <stdio.h> #include <time.h> int main() {     /*****************************************************************         time_t最大值测试     ************************************

C语言中求字符串的长度

在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示结束的,如: char str1[] = {'h','e','l','l','o','\0'}; 使用sizeof(str1) 结果为:6,因为包括 \0; 使用strln(str1)结果为:5,不包括 \0, 所以只求字符串中内容的长度,就使用strlen()函数 另: sizeof()函数,既可以用来计算

【c语言】实现一个函数,求字符串的长度

// 实现一个函数,求字符串的长度 #include <stdio.h> #include <assert.h> int my_strlen(char const *p) { int count = 0; assert(p != NULL); while(*p) { count++; p++; } return count; } int main() { char *p = "zhaoyaqian"; printf("长度是:%d\n", m

【c语言】实现一个函数,求字符串的长度,不允许创建第三方变量

// 实现一个函数,求字符串的长度,不允许创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(char const *p) { assert(p != NULL); if (*p == NULL) return 0; else return (1 + my_strlen_no(p + 1)); } int main() { char *p = "zhaoyaqian"; printf(

海伦公式求三角形垂线长度

/** * @Title: getVerticalVal * @Description: TODO(海伦公式求三角形垂线长度) * @param a 长度 * @param b 长度 * @param c 长度 * @return double 返回垂直线长度 * @throws */ private static double getVerticalVal(Double a,Double b,Double c){ double p=(a+b+c)/2; double k=p*(p-a)*(p-

28 python 序列的乘法(字符串乘法)检查某个值是否属于一个序列 求序列的长度、最大值和最小值

第四课:序列的乘法(字符串乘法) # 序列的乘法 # 序列和一个整数相乘 序列的乘法 可以达到 复制 整数份的字符串的效果 s = "a" print(s * 12) # aaaaaaaaaaaa numbers = [1,2,3,4,5] print(numbers * 3) # [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] # 打印正三角 * 号的功能 ''' [' ', ' ', ' ', ' ', ' ', '*', ' ', '