基础数学(数据结构所需基础)-不定期更新中...

基础数学(数据结构所需基础)-不定期更新中…

1. 指数

例如: X a X b = X a + b

2. 对数

在计算机科学中,除非有特别声明,否则所有的对数均以2为底
对数公式(四则运算法则):
l o g a ( M N ) = l o g a M + l o g a N ,
l o g a ( M / N ) = l o g a M l o g a N ,
l o g a M n = n l o g a M
换底公式: l o g m n = l o g a m / l o g a n
换底导出公式 : l o g M N = l o g N M
对数恒等式: a ( l o g a M ) = M

对数得来(10 为底数): 10 2 = 100 , l g 100 = 2

例(10 为底数):
计算该值: l g 200 l g 2
计算过程: l g 200 l g 2 = l g 200 / 2 = l g 100 = 2
例(10 为底数):
y=2^x,这就是一个次方函数,我们知道2^5=32,那么现在我想知道的就是32是2多少次方呢?这里就出现了我们提到的log函数,2就是指数函数中的底数,则y=2^x,的逆函数就是x=log2y,因排版原因,log2这个2是写在右下角。
现在知道以2为底数的log了,那不同底数的log按上面的理解就行了。

例如:
l o g A B = l o g c B l o g c A ; A , B , C > 0 , A 1 , c 1
例如:
(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. 级数

级数是指将数列的项依次用加号连接起来的函数
级数 公式: i = 1 n 2 i = 2 n + 1 1 , i = 1 n A i = A n + 1 1 A 1
如果 0< A < 1, i = 1 n A i 1 1 A

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

5. 证明的方法
5.1) 归纳法证明
5.1.1) 基准情形
5.1.2) 归纳假设

猜你喜欢

转载自blog.csdn.net/harisuperman/article/details/81018268
今日推荐