C语言必背100代码系列文章目录
核心内容:Hello World、条件判断、循环结构、数组基础、函数定义等。
核心内容:数组排序、字符串处理、多维数组、字符匹配、内存拷贝等。
核心内容:指针运算、动态内存分配、结构体指针、函数指针、内存泄漏检测等。
核心内容:阶乘递归、汉诺塔、分治算法、回溯算法、动态规划基础等。
核心内容:链表、栈、队列、二叉树、哈希表、图的基本操作。
核心内容:文本文件读写、二进制文件操作、日志管理、CSV/JSON解析等。
核心内容:快速幂、素数测试、进制转换、矩阵运算、蒙特卡洛模拟等。
核心内容:进程控制、线程同步、信号处理、套接字编程、系统调用封装等。
核心内容:TCP/UDP通信、HTTP请求、WebSocket、SSL/TLS加密、网络抓包等。
第七篇:数学与算法进阶
想解锁技术跃迁的密码?本文深度拆解10大进阶算法——从二次方程求解到AES加密实战,从Dijkstra路径规划到傅里叶变换,用C语言代码透视数学本质!无论你是渴望突破面试算法关的求职者,还是想优化系统性能的工程师,这里不仅有判别式、动态规划、蒙特卡洛方法的原理精讲,更附赠金融建模、网络安全、AI训练等场景的落地指南。拒绝纸上谈兵,用3万字代码+公式推导,带你吃透改变世界的算法思维!
1. 数值计算(求解二次方程)
c
#include <stdio.h>
#include <math.h>
void solveQuadratic(double a, double b, double c) {
double discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
double root1 = (-b + sqrt(discriminant)) / (2 * a);
double root2 = (-b - sqrt(discriminant)) / (2 * a);
printf("两个实根:%.2f, %.2f\n", root1, root2);
} else if (discriminant == 0) {
double root = -b / (2 * a);
printf("唯一实根:%.2f\n", root);
} else {
double realPart = -b / (2 * a);
double imagPart = sqrt(-discriminant) / (2 * a);
printf("虚根:%.2f+%.2fi, %.2f-%.2fi\n",
realPart, imagPart, realPart, imagPart);
}
}
int main() {
solveQuadratic(1, -3, 2); // 输出:1.00, 2.00
solveQuadratic(1, 2, 1); // 输出:-1.00
solveQuadratic(1, 0, 1); // 输出:虚根
return 0;
}
- 数学原理:
判别式 D=b2−4ac 决定根的类型。 - 应用场景:物理运动方程、金融模型。
- 扩展知识:
数值稳定性(如避免直接计算 b2−4ac)。
2. 密码学基础(AES加密)
c
#include <stdio.h>
#include <openssl/aes.h>
#define KEY_SIZE 32 // AES-256
void printHex(const unsigned char *data, int len) {
for (int i = 0; i < len; i++) {
printf("%02x", data[i]);
}
printf("\n");
}
int main() {
unsigned char key[KEY_SIZE] = "0123456789abcdef0123456789abcdef";
unsigned char iv[AES_BLOCK_SIZE] = "0123456789abcdef";
unsigned char plaintext[] = "Hello, AES-256!";
unsigned char ciphertext[128];
unsigned char decryptedtext[128];
AES_KEY encryptKey, decryptKey;
// 加密
AES_set_encrypt_key(key, KEY_SIZE * 8, &encryptKey);
AES_cbc_encrypt(plaintext, ciphertext, sizeof(plaintext),
&encryptKey, iv, AES_ENCRYPT);
printf("密文:");
printHex(ciphertext, sizeof(plaintext));
// 解密
AES_set_decrypt_key(key, KEY_SIZE * 8, &decryptKey);
AES_cbc_encrypt(ciphertext, decryptedtext, sizeof(plaintext),
&decryptKey, iv, AES_DECRYPT);
printf("解密结果:%s\n", decryptedtext);
return 0;
}
- 编译命令:
bash
gcc aes_example.c -o aes_example -lcrypto |
- 核心函数:
- AES_set_encrypt_key():设置加密密钥。
- AES_cbc_encrypt():CBC模式加密/解密。
- 应用场景:安全通信、数据存储。
- 注意事项:
- 密钥需安全存储(如使用HSM)。
- IV应随机生成且唯一。
3. 机器学习基础(线性回归)
c
#include <stdio.h>
#include <math.h>
// 简单线性回归:y = ax + b
void linearRegression(double x[], double y[], int n,
double *a, double *b) {
double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
for (int i = 0; i < n; i++) {
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumX2 += x[i] * x[i];
}
double denominator = n * sumX2 - sumX * sumX;
*a = (n * sumXY - sumX * sumY) / denominator;
*b = (sumY * sumX2 - sumX * sumXY) / denominator;
}
int main() {
double x[] = {1, 2, 3, 4, 5};
double y[] = {2, 4, 5, 4, 5};
double a, b;
linearRegression(x, y, 5, &a, &b);
printf("拟合方程:y = %.2fx + %.2f\n", a, b); // 输出:y = 0.60x + 2.20
return 0;
}
- 数学公式:
最小二乘法求解参数 a 和 b。 - 应用场景:预测分析、经济建模。
- 扩展知识:
- 梯度下降法(大数据集优化)。
- 多变量回归(矩阵运算)。
4. 动态规划(斐波那契数列)
c
#include <stdio.h>
#define N 50
long long fibonacci(int n) {
if (n <= 1) return n;
long long prev = 0, curr = 1, next;
for (int i = 2; i <= n; i++) {
next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
int main() {
printf("Fib(40) = %lld\n", fibonacci(40)); // 输出:102334155
return 0;
}
- 算法对比:
动态规划 vs 递归(时间复杂度从 O(2n) 降至 O(n))。 - 应用场景:路径规划、资源分配。
- 扩展知识:
记忆化搜索(自顶向下动态规划)。
5. 图算法(Dijkstra最短路径)
c
#include <stdio.h>
#include <limits.h>
#define V 5 // 顶点数
int minDistance(int dist[], int visited[]) {
int min = INT_MAX, minIndex;
for (int v = 0; v < V; v++) {
if (!visited[v] && dist[v] <= min) {
min = dist[v];
minIndex = v;
}
}
return minIndex;
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
int visited[V] = {0};
for (int i = 0; i < V; i++) {
dist[i] = INT_MAX;
}
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, visited);
visited[u] = 1;
for (int v = 0; v < V; v++) {
if (!visited[v] && graph[u][v] &&
dist[u] != INT_MAX &&
dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
printf("顶点\t距离源点\n");
for (int i = 0; i < V; i++) {
printf("%d\t%d\n", i, dist[i]);
}
}
int main() {
int graph[V][V] = {
{0, 10, 0, 5, 0},
{10, 0, 1, 2, 0},
{0, 1, 0, 0, 4},
{5, 2, 0, 0, 3},
{0, 0, 4, 3, 0}
};
dijkstra(graph, 0);
return 0;
}
- 输出示例:
顶点 距离源点
0 0
1 8
2 9
3 5
4 12
- 应用场景:网络路由、物流优化。
- 复杂度:( O(V^2) )(邻接矩阵实现)。
6. 排序算法优化(快速排序)
c
#include <stdio.h>
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int data[] = {8, 3, 1, 7, 0, 10, 2};
int n = sizeof(data) / sizeof(data[0]);
quickSort(data, 0, n - 1);
printf("排序结果:");
for (int i = 0; i < n; i++) {
printf("%d ", data[i]); // 输出:0 1 2 3 7 8 10
}
return 0;
}
- 优化技巧:
- 三数取中法选择pivot。
- 尾递归优化减少栈深度。
- 应用场景:大数据集排序(平均 O(nlogn))。
7. 数值积分(辛普森法则)
c
#include <stdio.h>
#include <math.h>
double f(double x) {
return sin(x); // 被积函数
}
double simpson(double a, double b, int n) {
double h = (b - a) / n;
double sum = f(a) + f(b);
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += (i % 2 == 0) ? 2 * f(x) : 4 * f(x);
}
return sum * h / 3;
}
int main() {
double result = simpson(0, M_PI, 1000);
printf("积分结果:%.6f\n", result); // 输出:2.000000(∫sin(x)dx从0到π)
return 0;
}
- 数学原理:
辛普森法则将积分区间划分为偶数个子区间,用抛物线近似曲线。 - 应用场景:物理计算、工程仿真。
- 精度控制:增加子区间数 n 提高精度。
8. 傅里叶变换(DFT实现)
c
#include <stdio.h>
#include <math.h>
#include <complex.h>
#define N 4
void dft(double complex *x, double complex *X) {
for (int k = 0; k < N; k++) {
X[k] = 0;
for (int n = 0; n < N; n++) {
double angle = -2 * M_PI * k * n / N;
X[k] += x[n] * cexp(I * angle);
}
}
}
int main() {
double complex x[N] = {1+0*I, 0-1*I, -1+0*I, 0+1*I};
double complex X[N];
dft(x, X);
printf("DFT结果:\n");
for (int k = 0; k < N; k++) {
printf("X[%d] = %.2f%+.2fi\n", k, creal(X[k]), cimag(X[k]));
}
return 0;
}
- 输出示例:
X[0] = 0.00+0.00i
X[1] = 0.00-4.00i
X[2] = 0.00+0.00i
X[3] = 0.00+4.00i
- 应用场景:信号处理、图像压缩。
- 扩展知识:
快速傅里叶变换(FFT,时间复杂度 ( O(n \log n) ))。
9. 线性代数(矩阵乘法)
c
#include <stdio.h>
#define ROW1 2
#define COL1 3
#define ROW2 3
#define COL2 2
void matrixMultiply(int mat1[][COL1], int mat2[][COL2], int result[][COL2]) {
for (int i = 0; i < ROW1; i++) {
for (int j = 0; j < COL2; j++) {
result[i][j] = 0;
for (int k = 0; k < COL1; k++) {
result[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
}
int main() {
int mat1[ROW1][COL1] = {{1, 2, 3}, {4, 5, 6}};
int mat2[ROW2][COL2] = {{7, 8}, {9, 10}, {11, 12}};
int result[ROW1][COL2];
matrixMultiply(mat1, mat2, result);
printf("矩阵乘法结果:\n");
for (int i = 0; i < ROW1; i++) {
for (int j = 0; j < COL2; j++) {
printf("%d\t", result[i][j]); // 输出:58 64 / 139 154
}
printf("\n");
}
return 0;
}
- 应用场景:图形变换、机器学习(神经网络权重矩阵)。
- 优化方向:
- 分块矩阵乘法(缓存友好)。
- 并行计算(如OpenMP)。
10. 概率统计(蒙特卡洛方法)
c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
double monteCarloPi(int samples) {
int hits = 0;
srand(time(NULL));
for (int i = 0; i < samples; i++) {
double x = (double)rand() / RAND_MAX;
double y = (double)rand() / RAND_MAX;
if (x*x + y*y <= 1.0) {
hits++;
}
}
return 4.0 * hits / samples;
}
int main() {
double pi = monteCarloPi(1000000);
printf("估算的π值:%.6f\n", pi); // 输出:约3.141592
return 0;
}
- 数学原理:
通过随机采样估算 π 值(面积比)。 - 应用场景:金融风险评估、物理模拟。
- 收敛速度:误差与 1/N 成正比。
扩展知识
- 数值稳定性:
- 避免减法取消(如使用Kahan求和算法)。
- 条件数与误差分析。
- 算法复杂度:
- 主定理(Master Theorem)分析递归复杂度。
- 摊还分析(如动态数组扩容)。
- 数学库加速:
- Intel MKL、OpenBLAS(优化线性代数运算)。
- CUDA/OpenCL(GPU加速计算)。
💡注意:本文所介绍的软件及功能均基于公开信息整理,仅供用户参考。在使用任何软件时,请务必遵守相关法律法规及软件使用协议。同时,本文不涉及任何商业推广或引流行为,仅为用户提供一个了解和使用该工具的渠道。
你在生活中时遇到了哪些问题?你是如何解决的?欢迎在评论区分享你的经验和心得!
希望这篇文章能够满足您的需求,如果您有任何修改意见或需要进一步的帮助,请随时告诉我!
感谢各位支持,可以关注我的个人主页,找到你所需要的宝贝。
博文入口:https://blog.youkuaiyun.com/Start_mswin 复制到【浏览器】打开即可,宝贝入口:https://pan.quark.cn/s/71742b5e7629
作者郑重声明,本文内容为本人原创文章,纯净无利益纠葛,如有不妥之处,请及时联系修改或删除。诚邀各位读者秉持理性态度交流,共筑和谐讨论氛围~