嵌套循环2(枚举环节)
任务1:鸡兔同笼(数学公式法)
问题描述:已知总头数 a 和总脚数 b,求鸡和兔的数量。
数学原理:
-
设鸡有
ji只,兔有tu只 - 方程组:
ji + tu = a 2*ji + 4*tu = b
- 解得:
tu = (b - 2*a)/2 ji = a - tu
代码实现:
#include <iostream> using namespace std; int main() { int a, b; // a:总头数, b:总脚数 cin >> a >> b; int tu = (b - 2 * a) / 2; int ji = a - tu; if (tu >= 0 && ji >= 0 && (b - 2 * a) % 2 == 0) cout << "鸡:" << ji << " 兔:" << tu; else cout << "无解"; return 0; }
任务2:鸡兔同笼(一重循环枚举)
枚举思路:固定鸡的数量,计算兔的数量是否满足条件
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; bool found = false; for (int ji = 0; ji <= a; ji++) { int tu = a - ji; if (2 * ji + 4 * tu == b) { cout << "鸡:" << ji << " 兔:" << tu; found = true; break; } } if (!found) cout << "无解"; return 0; }
任务3:鸡兔同笼(二重循环枚举)
暴力枚举:双重循环尝试所有可能组合
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; bool found = false; for (int ji = 0; ji <= a; ji++) { for (int tu = 0; tu <= a; tu++) { if (ji + tu == a && 2*ji + 4*tu == b) { cout << "鸡:" << ji << " 兔:" << tu; found = true; goto end; // 找到解直接跳出 } } } end: if (!found) cout << "无解"; return 0; }
任务4:百钱买百鸡
问题描述:100元买100只鸡,公鸡5元,母鸡3元,小鸡1元3只
#include <iostream> using namespace std; int main() { int sum = 100; // 百钱百鸡 for (int gj = 0; gj <= sum/5; gj++) { // 公鸡 for (int mj = 0; mj <= sum/3; mj++) { // 母鸡 int xj = sum - gj - mj; // 小鸡 if (5*gj + 3*mj + xj/3 == sum && xj%3 == 0) { cout << "公鸡:" << gj << " 母鸡:" << mj << " 小鸡:" << xj << endl; } } } return 0; }
任务5:n钱买百鸡(推广版)
问题描述:
-
给定总钱数
n元 -
公鸡价格
x元/只 -
母鸡价格
y元/只 -
小鸡
z只/元(即每元买z只小鸡) -
要求恰好买100只鸡
解法分析:
-
设公鸡
gj只,母鸡mj只,小鸡xj只 -
满足条件:
gj + mj + xj = 100 (总数量)
x*gj + y*mj + (1/z)*xj = n (总金额) - 注意小鸡数量必须是
z的倍数
代码实现:
#include <iostream> using namespace std; int main() { int n, x, y, z; cin >> n >> x >> y >> z; // 输入钱数、公鸡价、母鸡价、小鸡单价 bool found = false; for (int gj = 0; gj <= 100; gj++) { // 公鸡数量限制 for (int mj = 0; mj <= 100; mj++) { // 母鸡数量限制 int xj = 100 - gj - mj; // 小鸡数量 // 检查:小鸡数量必须能被z整除,且总金额等于n if (xj % z == 0 && x*gj + y*mj + xj/z == n) { cout << "公鸡:" << gj << " 母鸡:" << mj << " 小鸡:" << xj << endl; found = true; } } } if (!found) cout << "无解"; return 0; }
输入示例:
100 5 3 3
(表示100元,公鸡5元/只,母鸡3元/只,小鸡1元3只)
输出示例:
公鸡:0 母鸡:25 小鸡:75
公鸡:4 母鸡:18 小鸡:78
公鸡:8 母鸡:11 小鸡:81
公鸡:12 母鸡:4 小鸡:84
任务6:统计数字出现次数
问题描述:
给定一个整数范围 [a, b],统计数字 d (0 ≤ d ≤ 9) 在该范围内所有整数的各个数位上出现的总次数。
示例:
输入:1 20 1
输出:12
解释:数字1在1-20中出现的位置 → 1,10,11(两次),12,...,19 → 共12次
方法1:暴力枚举法(适合小范围)
#include<bits/stdc++.h> using namespace std; int main() { int L,R,k,sum = 0; //sum:k出现的次数 cin >> L >> R >> k; for(int i = L; i <= R; i++) { int x = i; while(x != 0) //数位分离的条件是x不为0 { if(x % 10 == k) sum++; //x个位是k,则sum++ x /= 10; //分离掉个位数 } } cout << sum; return 0; }

浙公网安备 33010602011771号