log函数的易混点

一.log函数

头文件:

#include <math.h>

使用

引入#include<cmath>

以e为底:log(exp(n))

以10为底:log10(n)

以m为底:log(n)/log(m)

重点:log()与log10()不是相同的函数
double log(double x);  /* 计算一个数字的自然对数 */
double log10(double x);  /* 计算以10为基数的对数 */

引申:

lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+......;

若要计算sum的对数,假如是以10为底,而sum=1*2*3*4*5*...

则可以:lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+......;

例题:poj 1423

数学解法:

#include<iostream>
#include<math.h>
using namespace std;
int num[10000001];
int main()
{
    int n;
    cin>>n;
//    lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4;
//其sum的位数是log10(sum)+1;
    double t=0;
    for(int i=1;i<=10000000;i++)
    {
        t+=log10((double)i);
        num[i]=(int)t+1;//下标应为整型
    }
    while(n--)
    {
        int h;
        cin>>h;
        cout<<num[h]<<endl;
    }
 } 

题目大意:求n的阶乘的位数,即n!的位数

sum=n!,其位数为log10(sum)+1;

相当于log10(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+.....

double t=0;

for(int i=1;i<=n;i++)     //得到n的阶乘y      log10(x)所得的数有些是小数,定义为double

{

t+=log10((double)i);     //注意这里的log10(i)里面的i一定要加一个强制转换,与t的数据类型相同,否则会报错

y=(int)t+1;

}

注意小tips:

1.a[i],数组下标i应为int型,否则会出现compile error

2.y=log10(x),其中y与x的数据类型应相同,否则会出现compile error(错误信息:对重载函数的调用不明确)

二.斯特灵公式

斯特灵公式是一条用来取n阶乘近似值数学公式

一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。即使在n很小的时候,斯特灵公式的取值也十分准确。

公式:n!约等于sqrt(2*pi*n)*[(n/e)^n]

n越大精确度越高,我们这只需求n!的位数,所以我们可以用该公式

ac代码:

#include<iostream>
#include<cmath>
using namespace std;
const double e=2.7182818284590452354,pi=3.141592653589793239;
double solve(int n)
{
    return (log10(2*pi*n))/2.0+n*(log10(n/e));//这里指数都化为乘积数
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        cout<<(int)solve(n)+1<<endl;
    }

}

原文地址:https://www.cnblogs.com/Aiahtwo/p/10518150.html

时间: 2024-10-08 16:37:12

log函数的易混点的相关文章

LeetCode 326 Power of Three(3的幂)(递归、Log函数)

翻译 给定一个整型数,写一个函数决定它是否是3的幂(翻译可能不太合适-- 跟进: 你是否可以不用任何循环或递归来完成. 原文 Given an integer, write a function to determine if it is a power of three. Follow up: Could you do it without using any loop / recursion? 分析 题意我其实不是满懂,比如说12到底可不可以呢?还是说只有:3.9.27.81这种才行呢?先写

易混点二

在层次化网络设计方案中,通常在(汇聚层)实现网络的访问策略控制. 层次化网络,核心,汇聚,接入: 核心层,骨干组件,高速交换组件,数据交换的任务: 汇聚层,核心层与终端用户接入层的分界面,网络访问策略,数据包处理,过滤,寻址,其他数据处理的任务: 接入层,本地网段用户接入: 易混点二

【转】 C++易混知识点2. 函数指针和指针函数的区别

我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念.指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间,但是所带来的好处就是C++如此强大的深层次原因了. 转载请注明出处: http://blog.csdn.net/elfprincexu 1. 指针函数, ( __type__ * func( void, int,) ) 顾名思义,他是一个函数,只不过和一般函数区分的原因是它返回的是一个指针.int*

LoadRunner学习笔记log函数

lr_log_message 只是记会写到本地vuser的log里面. lr_message和lr_output_message基本相同,它们会同时写到vuser的log和发送到controller里面,也就是说如果你 在有很多压力客户机,它们会把信息除了记录在本地的vuser之外,还要发送到远端的controller中,这会浪费大量的网络带宽和 controller的资源,lr_output_message多了一个输出信息语句在脚本中的位置. 当然要上面的函数有效果,你必须在run-time里

指针易混点

C++最强大的地方之一在于指针. 关于指针,首先我来说一下,它的好处. 好处一,用指针传递数据,节省空间和时间 好处二,可以动态的创建数组,也就是说在程序编译的时候创建内存空间. 比如说: int length; cin>>length; int * A = new int[length]; 以上代码是正确的,而且也很节省空间,用多少就开多少空间.与之相对立的是静态编译,在程序执行之前就已经将空间定下来,如果把最后一行改成int A[length]是通不过,因为程序执行之前需要确定数组的大小.

入前端以来,易混肴的前端知识,及一点想法。

前言:感觉任何行业开始都离不开一个借鉴,随着时间的积累,变得熟能生巧.能分辨出利于自己的,或是好用的.这篇文章算是一个积累或者在这个行业本人的部分映射/走向,随缘更新,大部分都是自己常用,但可能掉坑的,督促自己背下来. 零.趋势,前端顶峰,安全 2019的主体: GraphQL TypeScript React flutter 一. CSS 1. x:nth-of-type(n) 获取父元素下,的第 n 个 x 元素,tips:n 从 0 开始.(注意我的断句!) 2.x:nth-child(n

在非NDK编译条件下使用Android Log函数

解决的需求 有些时候不能在NDK环境编译,或者使用NDK编译会颇费周折,然后又想使用Android系统自带的Log类方法,那么我们就可以使用dlopen来实现我们的目的.比如在OpenCV中添加Android的Log打印. 关于dlopen dlopen和dlclose对处理的lib进行引用计数,dlopen使引用计数加1,dlclose让引用计数减1,当对库的引用计数达到0的时候,才会把库unmap掉. dlsym返回查找到的第一个符合要求的函数地址,该地址指的是库加载进进程虚拟地址. 可以使

android开发中怎么通过Log函数输出当前行号和当前函数名

public class Debug { public static int line(Exception e) { StackTraceElement[] trace = e.getStackTrace(); if (trace == null || trace.length == 0) return -1; // return trace[0].getLineNumber(); } public static String fun(Exception e) { StackTraceEleme

js中局部变量和全局变量的易混点

1.以下输出的是: undefined局部变量 <script type="application/javascript"> var scope="全局变量"; function cal(){ document.writeln(scope+"<br />"); var scope="局部变量";                                //(1)处 document.writeln