嵌套循环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只鸡

解法分析

  1. 设公鸡 gj 只,母鸡 mj 只,小鸡 xj 只

  2. 满足条件:

    gj + mj + xj = 100 (总数量)
    x*gj + y*mj + (1/z)*xj = n (总金额)

  3. 注意小鸡数量必须是 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;
}

 

posted @ 2025-04-24 21:13  CRt0729  阅读(58)  评论(0)    收藏  举报