对数在算法题目中的应用

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;
}

 (2) 对一个正整数n (n <= 1,000,000,000)和m (m <= 1,000,000,000)输出n的m次方的最左一位数字。

对于这个题目也是,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. 小结

我们初学编程的人经常只考虑如何快速的实现,而不考虑效率问题,经常随便写个大循环让计算机去跑,认为反正计算机不怕累,这样是不行的,我们应该用算法或数学公式等一切手法来提高程序的效率。

有句话是这么说的,计算机硬件配置再高,速度再快,那都不是给程序员用的,那是为用户服务的,我们程序员无权剥削计算机。


你可能感兴趣的:(算法,对数)