欢迎光临
我们一直在努力

高考数学97分,我的“数学直觉“比140分更好用:用笛卡尔积拆解 C 语言循环 / 穷举

今天学穷举算法,老师给了5个题:正方形、三角形、乘法表、百钱买百鸡、鸡兔同笼。 我写了5个嵌套循环,代码长得差不多,但总觉得"这不是在抄语法吗?"

#include <stdio.h>

int main() {
// ========== 正方形:二维笛卡尔积(无约束) ==========
for(int i=1; i<=10; i++) {
for(int j=1; j<=10; j++) {
printf(" * ");
}
printf("\\n");
}
// 数学化表达:
// 定义组合空间 S = {(i,j) | i∈[1,10], j∈[1,10]}
// 这是二维笛卡尔积,生成10×10=100个点
// 无约束条件,所有点都合法

// ========== 三角形:下三角矩阵(约束j≤i) ==========
for(int x=1; x<=10; x++) {
for(int y=1; y<=x; y++) {
printf(" * ");
}
printf("\\n");
}
// 数学化表达:
// 定义组合空间 S = {(x,y) | x∈[1,10], y∈[1,x]}
// 约束条件:y≤x,生成下三角矩阵
// 总点数 = 1+2+3+…+10 = 55(三角形数)

// ========== 乘法表:下三角矩阵 + 二元运算 ==========
for(int a=1; a<=9; a++) {
for(int b=1; b<=a; b++) {
printf(" %d*%d=%d ", a, b, a*b);
}
printf("\\n");
}
// 数学化表达:
// 定义二元运算 f(a,b) = a×b
// 定义域 D = {(a,b) | a∈[1,9], b∈[1,a]}
// 这是"下三角矩阵+二元运算"的组合

// ========== 穷举算法:笛卡尔积 + 约束函数 ==========
// 所有三位数 = 笛卡尔积{1,2,3,4}×{1,2,3,4}×{1,2,3,4}
for(int a1=1; a1<=4; a1++)
for(int a2=1; a2<=4; a2++)
for(int a3=1; a3<=4; a3++)
printf("%d ", a1*100 + a2*10 + a3);
// 数学化表达:
// 组合空间 S = {(a1,a2,a3) | a1,a2,a3∈[1,4]}
// 总组合数 = 4³ = 64
// 无约束函数,所有组合合法

// ========== 百钱买百鸡:约束优化(筛选合法解) ==========
for(int w=1; w<100; w++)
for(int m=1; m<100; m++)
for(int z=1; z<=100; z++)
if(w+m+z==100 && 5*w+3*m+z/3==100 && z%3==0)
printf("\\n 翁%d只、母%d只、雏%d只",w,m,z);
// 数学化表达:
// 组合空间 S = {(w,m,z) | w,m∈[1,99], z∈[1,100]}
// 约束函数 f(w,m,z) = { w+m+z==100,
// 5w+3m+z/3==100,
// z%3==0 }
// 合法解只有3个(约束函数筛选出来的)

// ========== 鸡兔同笼:二维约束优化 ==========
for(int x1=1; x1<35; x1++)
for(int x2=1; x2<35; x2++)
if(x1 + x2 == 35 && x1*2 + x2*4 == 94)
printf("\\n 鸡%d只,兔%d只",x1,x2);
// 数学化表达:
// 组合空间 S = {(x1,x2) | x1,x2∈[1,34]}
// 约束函数 f(x1,x2) = { x1+x2=35,
// 2×1+4×2=94 }
// 法律/医疗NLP = 超高维约束优化(几千维)

// ========== 我的发现 ==========
// 1. 嵌套循环 = 笛卡尔积(生成组合空间)+ 约束函数(筛选合法解)
// 2. 约束越少,解空间越大(正方形>三角形);约束越多,解越稀疏(百鸡=3解)
// 3. AI搜索 = 穷举算法 + 智能约束(剪枝),这是法律/医疗NLP的数学本质

return 0;
}

     就如上面的鸡兔同笼问题,我们可以换一种思路来减少维度

// 鸡兔同笼:35个头,94只脚,鸡(x1)、兔(x2)
int x1,x2;
printf("\\n\\n鸡兔同笼答案:");
// 优化循环:x2=35-x1,单循环即可
for(x1=0;x1<=35;x1++) // 鸡的数量:x1∈{0,1,…,35}
{
x2 = 35 – x1; // 兔的数量由头数约束算出
if(x1*2 + x2*4 == 94)
{
printf("\\n 鸡%d只,兔%d只",x1,x2);
}
}
return 0;
}

         约束条件 = 递推关系:鸡兔同笼里,知道头数就能用x2=35−x1把 2 层循环缩成 1 层,约束条件不是 “额外判断”,而是 “减少循环维度的工具”,这是我踩了无数坑才悟的。

总结

  • C 语言嵌套循环的本质是遍历高维笛卡尔积,循环层数对应笛卡尔积的维度;
  • 穷举法的优化核心是用数学约束缩小笛卡尔积的取值域,而非盲目遍历;
  • 约束条件不仅能筛选结果,还能推导递推关系、减少循环层数,提升代码效率
  • 注解

    笛卡尔积的基本概念

    笛卡尔积是指多个集合中所有可能的有序组合。对于两个集合A和B,它们的笛卡尔积A×B是所有有序对(a,b)的集合,其中a∈A,b∈B。当扩展到高维情况时,笛卡尔积会包含更多维度的组合。

    数学表示: 对于n个集合S₁, S₂, …, Sₙ,它们的笛卡尔积为: S₁ × S₂ × … × Sₙ = {(s₁, s₂, …, sₙ) | sᵢ ∈ Sᵢ, ∀i ∈ {1,2,…,n}}

    下期预告

               C语言指针的"地址映射"思维

    赞(0)
    未经允许不得转载:171主机测评 » 高考数学97分,我的“数学直觉“比140分更好用:用笛卡尔积拆解 C 语言循环 / 穷举
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址