C语言必背100代码系列-第七篇:数学与算法进阶

C语言必背100代码系列文章-第七篇:数学与算法进阶

C语言必背100代码系列文章目录

第一篇:基础语法与入门必背代码

    核心内容:Hello World、条件判断、循环结构、数组基础、函数定义等。

第二篇:数组与字符串操作

   核心内容:数组排序、字符串处理、多维数组、字符匹配、内存拷贝等。

第三篇:指针与内存管理

核心内容:指针运算、动态内存分配、结构体指针、函数指针、内存泄漏检测等。

第四篇:递归与算法

核心内容:阶乘递归、汉诺塔、分治算法、回溯算法、动态规划基础等。

第五篇:数据结构实现

核心内容:链表、栈、队列、二叉树、哈希表、图的基本操作。

第六篇:文件操作与IO

核心内容:文本文件读写、二进制文件操作、日志管理、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​ 成正比。

扩展知识

  1. 数值稳定性
    • 避免减法取消(如使用Kahan求和算法)。
    • 条件数与误差分析。
  2. 算法复杂度
    • 主定理(Master Theorem)分析递归复杂度。
    • 摊还分析(如动态数组扩容)。
  3. 数学库加速
    • Intel MKL、OpenBLAS(优化线性代数运算)。
    • CUDA/OpenCL(GPU加速计算)。

💡注意:本文所介绍的软件及功能均基于公开信息整理,仅供用户参考。在使用任何软件时,请务必遵守相关法律法规及软件使用协议。同时,本文不涉及任何商业推广或引流行为,仅为用户提供一个了解和使用该工具的渠道。

你在生活中时遇到了哪些问题?你是如何解决的?欢迎在评论区分享你的经验和心得!

希望这篇文章能够满足您的需求,如果您有任何修改意见或需要进一步的帮助,请随时告诉我!

感谢各位支持,可以关注我的个人主页,找到你所需要的宝贝。 ​ 
博文入口:https://blog.youkuaiyun.com/Start_mswin ​复制到【浏览器】打开即可,宝贝入口:https://pan.quark.cn/s/71742b5e7629 

作者郑重声明,本文内容为本人原创文章,纯净无利益纠葛,如有不妥之处,请及时联系修改或删除。诚邀各位读者秉持理性态度交流,共筑和谐讨论氛围~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山峰哥

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值