• C++
  • 数学模型转化为代码的典型案例笔记

  • @ 2025-7-15 11:00:18

C++ 学习笔记总结(结合数学分析与代码实现)

一、基础输入输出与简单公式计算

1. 矩形的周长与面积

题目与数学分析

  • 已知矩形长 a、宽 b,根据几何知识:
    • 周长公式:周长 = 2 * (长 + 宽) = 2*(a + b)
    • 面积公式:面积 = 长 * 宽 = a*b
  • 需求:输入 ab,输出周长和面积。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int a, b;
    // 从键盘输入矩形的长和宽,比如输入“3 2”,a=3、b=2 
    cin >> a >> b;  

    // 计算并输出周长:2*(a + b),代入3和2得2*(3+2)=10 
    cout << (a + b) * 2 << endl; 

    // 计算并输出面积:a*b,代入3和2得3*2=6 
    cout << a * b << endl;  

    return 0; 
}

知识要点

  • 输入输出基础cin 用于接收用户输入,cout 用于输出结果,endl 实现换行。
  • 公式转化代码:把数学公式直接写成代码中的运算,让程序完成计算逻辑。

2. 多边形内角和

题目与数学分析

  • 对于 n 边形(n ≥ 3 ),根据多边形内角和定理:
    内角和 = 180° * (n - 2)
  • 需求:输入边数 n,输出内角和。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int n;
    // 输入多边形的边数,比如输入3(三角形) 
    cin >> n;  

    // 用公式计算内角和:180*(n-2),n=3时得180*(1)=180 
    int interiorAngleSum = 180 * (n - 2); 

    // 输出内角和结果 
    cout << interiorAngleSum << endl; 

    return 0; 
}

知识要点

  • 数学定理应用:将多边形内角和的数学定理转化为代码,体现数学知识与编程的结合。
  • 变量作用:用变量 n 存输入的边数,用 interiorAngleSum 存计算后的内角和,让代码逻辑清晰。

二、多条件推导与计算

1. 奖牌数量计算

题目与数学分析

  • 已知:
    • 金牌数 a
    • 银牌数 = 金牌数 + ba + b
    • 铜牌数 = 银牌数 + c(a + b) + c
  • 总奖牌数 = 金牌 + 银牌 + 铜牌 → a + (a + b) + (a + b + c)
  • 需求:输入 abc,输出总奖牌数。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    // 输入金牌数、银牌比金牌多的数量、铜牌比银牌多的数量,比如输入1 2 3 
    cin >> a >> b >> c;  

    // 按公式计算总奖牌数:1 + (1+2) + (1+2+3) = 1+3+6=10 
    int total = a + (a + b) + (a + b + c); 

    // 输出总奖牌数结果 
    cout << total << endl; 

    return 0; 
}

知识要点

  • 多变量关联计算:通过题目条件,梳理出各奖牌数量的关联关系,用数学表达式串联,再转成代码。
  • 分步推导:从已知条件(金牌数)逐步推导银牌、铜牌数,最后求和,体现逻辑推导过程。

2. 数人数(男女生人数)

题目与数学分析

  • 设女生原有人数 x,男生原有人数 y
    • 条件1:男生比女生多 a 人 → y = x + a
    • 条件2:各离开 b 人后,男生是女生的2倍 → y - b = 2*(x - b)
  • 联立方程推导:
    y = x + a 代入 y - b = 2*(x - b),化简得:
    x + a - b = 2x - 2bx = a + b(女生原有人数);
    男生原有人数 y = x + a = 2a + b
  • 需求:输入 ab,输出原来男、女生人数。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int a, b;
    // 输入男生比女生多的人数、各自离开的人数,比如输入1 1 
    cin >> a >> b;  

    // 推导得女生原有人数:a + b → 1+1=2 
    int girl = a + b; 

    // 推导得男生原有人数:2a + b → 2*1+1=3 
    int boy = 2 * a + b; 

    // 输出男生人数 
    cout << boy << endl; 
    // 输出女生人数 
    cout << girl << endl; 

    return 0; 
}

知识要点

  • 方程联立求解:用数学方程描述题目条件,通过代数运算推导公式,再用代码实现公式计算。
  • 逻辑转化:把实际场景(男女生人数变化)转化为数学方程,体现编程解决实际问题的思路。

3. 盈亏问题(人数与物价)

题目与数学分析

  • 设人数 x,物价 y
    • 条件1:每人出 a 元,多 b 元 → a*x - y = b
    • 条件2:每人出 a-1 元,少 c 元 → (a-1)*x - y = -c
  • 联立方程推导:
    用条件2变形得 y = (a-1)*x + c,代入条件1:
    a*x - [(a-1)*x + c] = b → 化简得 x = b + c(人数);
    再代入 y = (a-1)*x + c 得物价公式。
  • 需求:输入 abc,输出人数和物价。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    // 输入每人出的钱、多的钱、少的钱,比如输入8 3 4 
    cin >> a >> b >> c;  

    // 推导得人数:b + c → 3+4=7 
    int people = b + c; 

    // 推导得物价:(a-1)*people + c → (8-1)*7 +4=53 
    int price = (a - 1) * people + c; 

    // 输出人数和物价,中间用空格隔开 
    cout << people << " " << price << endl; 

    return 0; 
}

知识要点

  • 数学建模:把实际团购场景转化为数学方程(盈亏关系),通过解方程推导公式。
  • 代码简洁性:用推导后的公式直接计算,避免复杂逻辑,体现数学对编程的简化作用。

三、规律探索与公式/数组应用(切蛋糕问题)

1. 数组版切蛋糕

题目与数学分析

  • n 刀时,蛋糕最多分成的块数有规律:
    • 切0刀:1块;
    • 切1刀:f(1) = f(0) + 1 = 2
    • 切2刀:f(2) = f(1) + 2 = 4
    • 切3刀:f(3) = f(2) + 3 = 7
    • 以此类推,得递推公式 f(n) = f(n-1) + nf(0)=1 )。
  • 需求:输入 n,输出切 n 刀后最多分成的块数。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int n;
    // 输入切割次数,比如输入3 
    cin >> n;  

    // 定义数组存每刀对应的块数,n最大5000,数组大小设5001 
    int f[5001]; 

    // 初始化:切0刀时1块 
    f[0] = 1; 

    // 从切1刀循环到切n刀,按递推公式计算 
    for (int i = 1; i <= n; i++) { 
        // 切i刀的块数 = 切i-1刀的块数 + i 
        f[i] = f[i - 1] + i; 
    }

    // 输出切n刀后的块数,输入3时f[3]=7 
    cout << f[n] << endl; 

    return 0; 
}

知识要点

  • 递推规律应用:发现切蛋糕块数的递推关系,用数组存储中间结果,通过循环逐步计算。
  • 数组作用:用数组保存每一步(每一刀)的结果,方便后续直接获取最终 n 刀的答案,体现“以空间换时间”的编程思路。

2. 公式版切蛋糕

题目与数学分析

  • 通过观察递推规律,推导通用公式:
    • 递推公式 f(n) = f(n-1) + n,且 f(0)=1
    • 展开递推:
      f(n) = 1 + 1 + 2 + 3 + ... + n(因为 f(0)=1f(1)=f(0)+1f(2)=f(1)+2 ,… );
    • 其中 1 + 2 + ... + n 是等差数列求和,公式为 n*(n+1)/2
    • 所以最终公式:f(n) = n*(n+1)/2 + 1
  • 需求:输入 n,用公式直接计算并输出块数。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int n;
    // 输入切割次数,比如输入3 
    cin >> n;  

    // 用推导的公式计算:3*(3+1)/2 +1 = 6 +1=7 
    int result = n * (n + 1) / 2 + 1; 

    // 输出结果 
    cout << result << endl; 

    return 0; 
}

知识要点

  • 规律总结与公式推导:从递推规律中总结出数学公式,简化计算逻辑,避免循环和数组,提升效率。
  • 数学简化编程:用数学方法(等差数列求和)优化代码,体现数学对编程效率的提升作用。

四、方程组求解(数球数问题)

数球数(足球、篮球、排球数量)

题目与数学分析

  • 设足球 x 个、篮球 y 个、排球 z 个:
    • 条件1:足球 + 篮球 = ax + y = a
    • 条件2:篮球 + 排球 = by + z = b
    • 条件3:排球 + 足球 = cz + x = c
  • 联立方程组求解:
    把三个方程相加 → 2(x + y + z) = a + b + cx + y + z = (a + b + c)/2
    再分别减去原方程:
    • x = (a + c - b)/2(足球数);
    • y = (a + b - c)/2(篮球数);
    • z = (b + c - a)/2(排球数)。
  • 需求:输入 abc,输出三种球的数量。

代码实现(带注释)

#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    // 输入足球+篮球、篮球+排球、排球+足球的数量,比如输入8 5 7 
    cin >> a >> b >> c;  

    // 按公式计算足球数量:(8+7-5)/2=10/2=5 
    int football = (a + c - b) / 2; 

    // 按公式计算篮球数量:(8+5-7)/2=6/2=3 
    int basketball = (a + b - c) / 2; 

    // 按公式计算排球数量:(5+7-8)/2=4/2=2 
    int volleyball = (b + c - a) / 2; 

    // 输出足球数量 
    cout << football << endl; 
    // 输出篮球数量 
    cout << basketball << endl; 
    // 输出排球数量 
    cout << volleyball << endl; 

    return 0; 
}

知识要点

  • 方程组求解:用数学方法解多元一次方程组,推导各变量公式,再用代码实现。
  • 实际问题抽象:把球的数量关系抽象成数学方程组,体现编程解决实际问题的“建模→求解”思路。

总结

这些 C++ 练习,核心是 “数学分析 → 逻辑推导 → 代码实现” 的过程:

  1. 数学是基础:用几何公式(矩形周长面积)、定理(多边形内角和)、方程(盈亏、数人数、数球数)、规律(切蛋糕递推)等,把实际问题转化为数学模型。
  2. 逻辑推导是关键:通过联立方程、递推分析、规律总结,推导出计算结果的公式或步骤。
  3. 代码是工具:用 cin/cout 处理输入输出,用变量、数组、循环等实现数学逻辑,让程序自动完成计算。

从简单公式计算,到复杂方程组、递推规律,逐步锻炼 “把实际问题抽象成数学模型,再转化为代码” 的能力,这是编程解决问题的核心思路。后续可深入学习数据结构(如链表、树)和算法(如排序、搜索),解决更复杂的场景,但底层逻辑(数学建模 + 代码实现)是相通的~

0 条评论

目前还没有评论...