基础数学(数据结构所需基础)-不定期更新中…
1. 指数
例如: …
2. 对数
在计算机科学中,除非有特别声明,否则所有的对数均以2为底
对数公式(四则运算法则):
,
,
换底公式:
换底导出公式 :
对数恒等式:
对数得来(10 为底数): ,
例(10 为底数):
计算该值:
计算过程:
例(10 为底数):
y=2^x,这就是一个次方函数,我们知道2^5=32,那么现在我想知道的就是32是2多少次方呢?这里就出现了我们提到的log函数,2就是指数函数中的底数,则y=2^x,的逆函数就是x=log2y,因排版原因,log2这个2是写在右下角。
现在知道以2为底数的log了,那不同底数的log按上面的理解就行了。例如:
例如:
(1) 求 N ! (1 <= N <= 5000)中有多少位数字。
若直接求 N ! 的结果,然后再计算有多少位数字,也是可行的,因为是大数阶乘,所以要用数组来计算,会用到大量的乘法除法取余运算,时间空间花费都比较大。
用对数的性质来解这个题是最佳的选择。
首先我们知道 看一个数字有多少位就是看它是10的几次幂,如101有2位,102 有3位。
也就是 10x(k=
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. 级数
级数是指将数列的项依次用加号连接起来的函数
级数 公式:
,
如果 0< A < 1,
4. 模运算
取余:取余运算在计算商值时向0方向舍弃小数位
取余,遵循尽可能让余数的绝对值小的原则
取余例子:
5 rem 3 = 2
-5 rem 3 = -2
5 rem -3 = 2
-5 rem -3 = -2
取模:取模运算在计算商值时向负无穷舍弃小数位
取模,遵循尽可能让商小的原则
取模例子:
5 mod 3 = 2
-5 mod 3 = 1
5 mod -3 = -1
-5 mod -3 = -2