- C++
数学模型转化为代码的典型案例笔记
- 2025-7-15 11:00:18 @
C++ 学习笔记总结(结合数学分析与代码实现)
一、基础输入输出与简单公式计算
1. 矩形的周长与面积
题目与数学分析
- 已知矩形长
a
、宽b
,根据几何知识:- 周长公式:
周长 = 2 * (长 + 宽) = 2*(a + b)
- 面积公式:
面积 = 长 * 宽 = a*b
- 周长公式:
- 需求:输入
a
和b
,输出周长和面积。
代码实现(带注释)
#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
; - 银牌数 = 金牌数 +
b
→a + b
; - 铜牌数 = 银牌数 +
c
→(a + b) + c
;
- 金牌数
- 总奖牌数 = 金牌 + 银牌 + 铜牌 →
a + (a + b) + (a + b + c)
。 - 需求:输入
a
、b
、c
,输出总奖牌数。
代码实现(带注释)
#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)
;
- 条件1:男生比女生多
- 联立方程推导:
把y = x + a
代入y - b = 2*(x - b)
,化简得:
x + a - b = 2x - 2b
→x = a + b
(女生原有人数);
男生原有人数y = x + a = 2a + b
。 - 需求:输入
a
、b
,输出原来男、女生人数。
代码实现(带注释)
#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
;
- 条件1:每人出
- 联立方程推导:
用条件2变形得y = (a-1)*x + c
,代入条件1:
a*x - [(a-1)*x + c] = b
→ 化简得x = b + c
(人数);
再代入y = (a-1)*x + c
得物价公式。 - 需求:输入
a
、b
、c
,输出人数和物价。
代码实现(带注释)
#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) + n
(f(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)=1
,f(1)=f(0)+1
,f(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:足球 + 篮球 =
a
→x + y = a
; - 条件2:篮球 + 排球 =
b
→y + z = b
; - 条件3:排球 + 足球 =
c
→z + x = c
;
- 条件1:足球 + 篮球 =
- 联立方程组求解:
把三个方程相加 →2(x + y + z) = a + b + c
→x + y + z = (a + b + c)/2
;
再分别减去原方程:x = (a + c - b)/2
(足球数);y = (a + b - c)/2
(篮球数);z = (b + c - a)/2
(排球数)。
- 需求:输入
a
、b
、c
,输出三种球的数量。
代码实现(带注释)
#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++ 练习,核心是 “数学分析 → 逻辑推导 → 代码实现” 的过程:
- 数学是基础:用几何公式(矩形周长面积)、定理(多边形内角和)、方程(盈亏、数人数、数球数)、规律(切蛋糕递推)等,把实际问题转化为数学模型。
- 逻辑推导是关键:通过联立方程、递推分析、规律总结,推导出计算结果的公式或步骤。
- 代码是工具:用
cin
/cout
处理输入输出,用变量、数组、循环等实现数学逻辑,让程序自动完成计算。
从简单公式计算,到复杂方程组、递推规律,逐步锻炼 “把实际问题抽象成数学模型,再转化为代码” 的能力,这是编程解决问题的核心思路。后续可深入学习数据结构(如链表、树)和算法(如排序、搜索),解决更复杂的场景,但底层逻辑(数学建模 + 代码实现)是相通的~
0 条评论
目前还没有评论...