1.对数的性质
(1) alogab=b
(2) logaa=1
(3) loga(M*N)=logaM+logaN
(4) loga(M÷N)=logaM-logaN
(5) loga(Mn)=nlogaM
(6) logaM1/n=logaM/n
(7) logab*logba=1
2. 相关题目
(1) 求 N ! (1 <= N <= 5000)中有多少位数字。
若直接求 N ! 的结果,然后再计算有多少位数字,也是可行的,因为是大数阶乘,所以要用数组来计算,会用到大量的乘法除法取余运算,时间空间花费都比较大。
用对数的性质来解这个题是最佳的选择。
首先我们知道 看一个数字有多少位就是看它是10的几次幂,如101有2位,102 有3位。。。
也就是 10x(k=<x<k+1,k为整数,x为浮点数),则 10x的结果就有k+1位数字。
那也就是我们要求log10( N ! )
log10( N ! ) = log101 + log102 + log103 + ... + log10N
int GetDigitsNumInFactorial(int n) { double d = 0.0; for(int i = 1; i <= n; i++) d += log10(i); return int(d)+1; }
对于这个题目也是,n的范围这么大,肯定也不能直接去求了。还是利用对数来解决。
令x=log10(nm)=m*log10n,即nm=10x。设x的整数部分为a,小数部分为b,nm=10a*10b,对于10的整数次幂10a,第一位是1,所以,nm的第一位数取决于10b。
int GetLeftMostDigitOfMthPower(int n, int m) { double x, a, b; x = m * log10(n); a = floor(x); b = x - a; return int(pow(10, b)); }
3. 小结
我们初学编程的人经常只考虑如何快速的实现,而不考虑效率问题,经常随便写个大循环让计算机去跑,认为反正计算机不怕累,这样是不行的,我们应该用算法或数学公式等一切手法来提高程序的效率。
有句话是这么说的,计算机硬件配置再高,速度再快,那都不是给程序员用的,那是为用户服务的,我们程序员无权剥削计算机。