朋友,还有其他的么?
下面整理了一些常见的数学公式及其对应的简单代码实现示例。
(示例均使用 C++ 风格伪代码,旨在演示逻辑,不做过多优化与异常处理。)
1. $\displaystyle \sum_{t=1}^{n} t$
数学公式
$$ \sum_{t=1}^{n} t \;=\; 1 + 2 + 3 + \cdots + n \;=\; \frac{n(n+1)}{2}. $$
代码方式 1:直接循环累加
long long sum_1_to_n(int n) {
long long ans = 0;
for (int t = 1; t <= n; t++) {
ans += t;
}
return ans;
}
代码方式 2:用封闭公式(效率更高)
long long sum_1_to_n_fast(int n) {
return (long long)n * (n+1) / 2;
}
2. $\displaystyle \sum_{t=1}^{n} t^k$
数学公式
$$ \sum_{t=1}^{n} t^k \quad (\text{其中 } k \text{ 是正整数}) $$
没有像 $\sum t$ 那样的简洁“通用”封闭公式(但某些 k 有具体公式,如 $k=2$ 或 $k=3$ 等可以写成多项式)。一般情况下,可以直接循环或使用一些多项式公式(伯努利数、Faulhaber 公式等)。
代码示例:直接循环
long long sum_t_pow_k(int n, int k) {
long long ans = 0;
for (int t = 1; t <= n; t++) {
long long cnt = 1;
// 计算 t^k
for (int j = 0; j < k; j++) {
cnt *= t;
}
ans += cnt;
}
return ans;
}
对于 $k=2$、$k=3$、$k=4$ 等也可用已知的多项式简化:
- $k=2$: $\sum_{t=1}^{n} t^2 = \frac{n(n+1)(2n+1)}{6}$.
- $k=3$: $\sum_{t=1}^{n} t^3 = \Bigl(\frac{n(n+1)}{2}\Bigr)^2$.
比如:
long long sum_of_squares(int n) {
// \sum_{t=1}^{n} t^2 = n(n+1)(2n+1)/6
return (long long)n*(n+1)*(2LL*n+1)/6;
}
long long sum_of_cubes(int n) {
// \sum_{t=1}^{n} t^3 = [n(n+1)/2]^2
long long tmp = (long long)n*(n+1)/2;
return tmp*tmp;
}
3. $\displaystyle t^k$
数学公式
$$ t^k = \underbrace{t \times t \times \cdots \times t}_{k\text{次}} $$
代码示例:循环乘法
long long power(int t, int k) {
long long cnt = 1;
for (int j = 0; j < k; j++) {
cnt *= t;
}
return cnt;
}
代码示例:快速幂(更高效)
(可以在 $O(\log k)$ 时间内计算 $t^k$)
// y版
int quick_power(int a, int k, int p) // 求a^k mod p
{
int res = 1 % p;
while (k)
{
if (k & 1) res = (LL)res * a % p;
a = (LL)a * a % p;
k >>= 1;
}
return res;
}
long long fast_power(long long base, int exp) {
long long result = 1;
long long cur = base;
int e = exp;
while (e > 0) {
if (e & 1) result *= cur;
cur *= cur;
e >>= 1;
}
return result;
}
4. 阶乘 (factorial): $\displaystyle n!$
数学公式
$$ n! = n \times (n-1) \times (n-2) \times \cdots \times 2 \times 1. $$
代码示例
long long factorial(int n) {
long long ans = 1;
for (int i = 1; i <= n; i++) {
ans *= i;
}
return ans;
}
5. 组合数: $\displaystyle \binom{n}{k}$
数学公式
$$ \binom{n}{k} \;=\; \frac{n!}{k!(n-k)!}. $$
代码方式 1:直接用阶乘(可能易溢出或低效)
long long comb(int n, int k) {
// 需要注意溢出风险
if (k > n) return 0;
long long nf = factorial(n);
long long kf = factorial(k);
long long nkf = factorial(n-k);
return nf / (kf * nkf);
}
代码方式 2:逐项相乘/相除(避免部分溢出)
long long comb2(int n, int k) {
if (k > n) return 0;
if (k > n - k) k = n - k; // C(n,k) = C(n,n-k)
long long ans = 1;
for (int i = 0; i < k; i++) {
ans = ans * (n - i) / (i + 1);
}
return ans;
}
6. 等比数列求和: $\displaystyle \sum_{i=0}^{k} r^i$
数学公式
$$ 1 + r + r^2 + \cdots + r^k \;=\; \frac{r^{k+1} - 1}{r - 1} \quad (\text{若 }r \neq 1). $$
代码示例
long long geometric_sum(long long r, int k) {
if (r == 1) {
// 特殊情况:r=1 => k+1 项,每项=1
return k + 1;
}
// 用快速幂算 r^(k+1)
long long numerator = fast_power(r, k+1) - 1;
return numerator / (r - 1);
}
7. 等差数列求和: $\displaystyle \sum_{t=1}^{n} (a + (t-1)d)$
数学公式
$$ a + (a + d) + (a + 2d) + \cdots + \bigl(a + (n-1)d\bigr) \;=\; n \times \Bigl(a + \frac{(n-1)d}{2}\Bigr). $$
代码示例
long long arithmetic_sum(long long a, long long d, int n) {
// (n/2) * (2a + (n-1)d) 也是常见写法
return (long long)n * (2LL*a + (n-1)*d) / 2;
}
8. 小结
- 上述示例演示了几类常见的数学公式(如累加、累乘、指数、阶乘、组合数等)如何在代码里实现。
- 当公式具有封闭形式(如 $\frac{n(n+1)}{2}$、$\frac{n(n+1)(2n+1)}{6}$、$\bigl[\frac{n(n+1)}{2}\bigr]^2$)时,使用它往往比直接循环更快。
- 在无简单封闭形式的情况下(如 $\sum t^k$ 的一般情形),可以用循环或更复杂的数学手段(例如伯努利数、Faulhaber 公式等)来求解。
这些示例能帮助我们从常见的数学表达式快速转换到对应的代码实现。