枚举算法和排序算法能力测试

发布于:2025-09-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

枚举算法

题目 1:找出 1-20 中既是偶数又是 3 的倍数的数

题目描述:小明想找出 1 到 20 中既能被 2 整除又能被 3 整除的数字,帮他列出来吧。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 1; a <= 20; a++) {
        if (a % 2 == 0 && a % 3 == 0) {  // 同时满足两个条件
            cout << a << " ";
        }
    }
    return 0;
}

解释:用for循环枚举 1-20 的每个数,通过&&判断是否同时满足 "被 2 整除" 和 "被 3 整除",符合条件就输出。

题目 2:找出个位是 5 的两位数

题目描述:列出所有个位是 5 的两位数(10-99 之间)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 10; a <= 99; a++) {
        if (a % 10 == 5) {  // 个位是5的数除以10余数为5
            cout << a << " ";
        }
    }
    return 0;
}

解释:循环枚举所有两位数,用a%10==5判断个位是否为 5,是的话就输出。

题目 3:找特殊数字(1-10 中既不是奇数也不是合数的数)

题目描述:在 1-10 中,找出既不是奇数(排除 1,3,5,7,9)又不是合数(排除 4,6,8,9,10)的数字。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 1; a <= 10; a++) {
        // 偶数(不是奇数)且不是合数
        if (a % 2 == 0 && (a == 2)) {
            cout << a;
        }
    }
    return 0;
}

解释:通过枚举逐个判断,1-10 中只有 2 是偶数且不是合数(合数指除了 1 和自身还有其他因数的数)。

题目 4:计算 1-10 中所有单数的和

题目描述:计算 1 到 10 中所有单数(1,3,5,7,9)的总和。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, s = 0;
    for (a = 1; a <= 10; a++) {
        if (a % 2 == 1) {  // 单数除以2余数为1
            s = s + a;
        }
    }
    cout << s;
    return 0;
}

解释:用s记录总和,循环中判断如果是单数就加到s里,最后输出总和。

题目 5:找出能同时被 4 和 6 整除的三位数(100-200)

题目描述:在 100 到 200 之间,找出能同时被 4 和 6 整除的数。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 100; a <= 200; a++) {
        if (a % 4 == 0 && a % 6 == 0) {
            cout << a << " ";
        }
    }
    return 0;
}

解释:枚举 100-200 的数,同时满足被 4 和 6 整除的数就是公倍数,通过&&连接两个条件判断。

题目 6:找数字(1-50 中十位比个位大的数)

题目描述:找出 1-50 中十位数字比个位数字大的数(比如 21:十位 2 > 个位 1)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, s, g;  // s是十位,g是个位
    for (a = 1; a <= 50; a++) {
        s = a / 10;  // 取十位(如21/10=2)
        g = a % 10;  // 取个位(如21%10=1)
        if (s > g) {
            cout << a << " ";
        }
    }
    return 0;
}

解释:通过a/10取十位数字,a%10取个位数字,比较后输出符合条件的数。

题目 7:判断一个数是否在 3-7 之间(含边界)

题目描述:输入一个整数,判断它是否在 3 到 7 之间(包括 3 和 7)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    cin >> a;
    if (a >= 3 && a <= 7) {
        cout << "是";
    } else {
        cout << "否";
    }
    return 0;
}

解释:用&&判断输入的数是否同时满足大于等于 3 和小于等于 7,输出对应结果。

题目 8:找出 1-100 中是 7 的倍数但不是 5 的倍数的数

题目描述:列出 1 到 100 中能被 7 整除,但不能被 5 整除的数。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 1; a <= 100; a++) {
        if (a % 7 == 0 && a % 5 != 0) {
            cout << a << " ";
        }
    }
    return 0;
}

解释:枚举范围内的数,判断是否是 7 的倍数且不是 5 的倍数,符合条件则输出。

题目 9:计算 1-9 中所有双数的乘积

题目描述:计算 1 到 9 中所有双数(2,4,6,8)的乘积。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, p = 1;  // p存储乘积,初始值为1
    for (a = 1; a <= 9; a++) {
        if (a % 2 == 0) {
            p = p * a;
        }
    }
    cout << p;
    return 0;
}

解释:用p记录乘积(初始为 1),循环中遇到双数就相乘,最后输出结果。

题目 10:找月份(一年中天数小于 30 的月份)

题目描述:一年有 12 个月份,其中 2 月(28 天)、4 月(30 天?不,4 月是 30 天,修正:2 月 < 30 天),请输出天数小于 30 的月份数字。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 1; a <= 12; a++) {
        if (a == 2) {  // 只有2月天数小于30
            cout << a << " ";
        }
    }
    return 0;
}

解释:枚举 1-12 月,判断是否为 2 月(一年中唯一天数小于 30 的月份),是的话输出。

模拟算法(新颖题型)

题目 1:模拟钟表报时(输入小时,输出对应点数)

题目描述:输入当前小时数(1-12),模拟钟表报时,输出对应数量的 "咚"(如输入 3,输出 "咚咚咚")。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a;
    for (b = 1; b <= a; b++) {
        cout << "咚";
    }
    return 0;
}

解释:输入小时数a,循环a次输出 "咚",模拟钟表报时的声音。

题目 2:模拟电梯运行(从 1 楼到指定楼层)

题目描述:电梯初始在 1 楼,输入目标楼层(1-10),输出电梯经过的所有楼层(如输入 5,输出 "1 2 3 4 5")。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a;
    for (b = 1; b <= a; b++) {
        cout << b << " ";
    }
    return 0;
}

解释:从 1 开始循环到目标楼层a,依次输出经过的楼层,模拟电梯上升过程。

题目 3:模拟水果拼盘(输入两种水果,交替输出 3 次)

题目描述:输入两种水果名称(如 "苹果" 和 "香蕉"),交替输出 3 次(结果:苹果 香蕉 苹果 香蕉 苹果 香蕉)。
代码

cpp

运行

#include <iostream>
#include <string>
using namespace std;
int main() {
    string a, b;
    int c;
    cin >> a >> b;
    for (c = 1; c <= 3; c++) {
        cout << a << " " << b << " ";
    }
    return 0;
}

解释:循环 3 次,每次输出两种水果,模拟交替摆放水果的过程。

题目 4:模拟分数统计(输入 3 个成绩,计算平均分)

题目描述:输入 3 个 100 以内的整数(代表成绩),计算并输出它们的平均分(保留整数)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, avg;
    cin >> a >> b >> c;
    avg = (a + b + c) / 3;  // 整数除法自动取整
    cout << avg;
    return 0;
}

解释:输入三个成绩,求和后除以 3 得到平均分,模拟简单的分数统计。

题目 5:模拟信号灯(红黄绿依次亮 2 秒,输出顺序)

题目描述:交通信号灯按 "红→黄→绿" 的顺序循环,每次亮 2 秒,输出前 3 次循环的顺序(共 9 个状态)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b;
    for (a = 1; a <= 3; a++) {  // 3次循环
        for (b = 1; b <= 3; b++) {  // 每次循环3个灯
            if (b == 1) cout << "红 ";
            else if (b == 2) cout << "黄 ";
            else cout << "绿 ";
        }
    }
    return 0;
}

解释:外层循环控制 3 次循环,内层循环依次输出红黄绿,模拟信号灯交替亮的过程。

题目 6:模拟折纸(一张纸对折 3 次后有几层?)

题目描述:一张纸初始 1 层,每对折 1 次层数翻倍,输入对折次数(1-5),输出最终层数。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, c = 1;  // c是层数,初始1层
    cin >> a;
    for (int b = 1; b <= a; b++) {
        c = c * 2;  // 每次对折翻倍
    }
    cout << c;
    return 0;
}

解释:用c记录层数,循环a次(对折次数),每次乘以 2,模拟折纸层数变化。

题目 7:模拟排队叫号(从 1 号开始,叫到指定号码)

题目描述:医院排队叫号,从 1 号开始,输入今天要叫的最后一个号码(1-20),输出所有被叫到的号码。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a;
    for (b = 1; b <= a; b++) {
        cout << "请" << b << "号就诊 ";
    }
    return 0;
}

解释:循环从 1 到输入的号码a,输出叫号提示,模拟排队叫号过程。

题目 8:模拟分配糖果(每人分 3 颗,余 2 颗,计算总糖果数)

题目描述:老师给小朋友分糖果,每人分 3 颗,最后还剩 2 颗,输入小朋友人数(1-10),计算总糖果数。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, c;
    cin >> a;
    c = a * 3 + 2;  // 每人3颗加剩余2颗
    cout << c;
    return 0;
}

解释:根据人数a计算总糖果数(人数 ×3+2),模拟糖果分配场景。

题目 9:模拟星期几(输入数字 1-7,输出对应星期)

题目描述:输入 1-7 的数字,1 代表星期一,2 代表星期二……7 代表星期日,输出对应星期。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    cin >> a;
    if (a == 1) cout << "星期一";
    else if (a == 2) cout << "星期二";
    else if (a == 3) cout << "星期三";
    else if (a == 4) cout << "星期四";
    else if (a == 5) cout << "星期五";
    else if (a == 6) cout << "星期六";
    else cout << "星期日";
    return 0;
}

解释:根据输入的数字,用多分支if-else判断并输出对应星期,模拟星期转换。

题目 10:模拟植树(每隔 2 米种 1 棵,从 0 米开始,种到 10 米)

题目描述:在一条路上从 0 米处开始种树,每隔 2 米种 1 棵,一直种到 10 米处,输出所有种树的位置。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a;
    for (a = 0; a <= 10; a += 2) {  // 每次加2米
        cout << a << "米处种树 ";
    }
    return 0;
}

解释:从 0 开始,每次增加 2 米(间隔),输出种树位置,模拟植树过程。

排序算法(新颖题型)

题目 1:给三个水果按首字母排序(苹果、香蕉、橙子)

题目描述:输入三个水果名称(苹果、香蕉、橙子中的三个),按拼音首字母(A < X < C)排序后输出。
代码

cpp

运行

#include <iostream>
#include <string>
using namespace std;
int main() {
    string a, b, c, t;
    cin >> a >> b >> c;
    // 比较交换a和b
    if (a > b) { t = a; a = b; b = t; }
    // 比较交换a和c(确保a最小)
    if (a > c) { t = a; a = c; c = t; }
    // 比较交换b和c(确保b中间)
    if (b > c) { t = b; b = c; c = t; }
    cout << a << " " << b << " " << c;
    return 0;
}

解释:通过三次比较交换,将三个字符串按首字母顺序排序(利用字符串比较规则)。

题目 2:给三个数字按从大到小排序

题目描述:输入三个整数,按从大到小的顺序输出。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, t;
    cin >> a >> b >> c;
    if (a < b) { t = a; a = b; b = t; }  // a和b交换,确保a>=b
    if (a < c) { t = a; a = c; c = t; }  // a和c交换,确保a最大
    if (b < c) { t = b; b = c; c = t; }  // b和c交换,确保b次之
    cout << a << " " << b << " " << c;
    return 0;
}

解释:通过三次比较交换,先确保最大的数在a,再确保中间的数在b,实现从大到小排序。

题目 3:给两个数字交换位置后输出

题目描述:输入两个整数,交换它们的位置后输出(如输入 3 5,输出 5 3)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, t;
    cin >> a >> b;
    t = a;  // 临时变量t保存a的值
    a = b;  // 把b的值给a
    b = t;  // 把t(原来的a)给b
    cout << a << " " << b;
    return 0;
}

解释:用临时变量t作为中间容器,实现两个变量的值交换,是排序的基础操作。

题目 4:给四个数字中的最大值和最小值排序

题目描述:输入四个整数,只输出其中的最大值和最小值(按 "最大值 最小值" 顺序)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, d, max, min;
    cin >> a >> b >> c >> d;
    max = a;  // 假设a是最大值
    if (b > max) max = b;
    if (c > max) max = c;
    if (d > max) max = d;
    
    min = a;  // 假设a是最小值
    if (b < min) min = b;
    if (c < min) min = c;
    if (d < min) min = d;
    
    cout << max << " " << min;
    return 0;
}

解释:分别找出四个数中的最大值和最小值,按要求顺序输出,是简化的排序问题。

题目 5:按身高排序(三个小朋友的身高)

题目描述:输入三个小朋友的身高(厘米,整数),按从矮到高的顺序输出。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, t;
    cin >> a >> b >> c;
    // 冒泡排序思想:两两比较交换
    if (a > b) { t = a; a = b; b = t; }
    if (b > c) { t = b; b = c; c = t; }
    if (a > b) { t = a; a = b; b = t; }  // 可能需要再比较一次a和b
    cout << a << " " << b << " " << c;
    return 0;
}

解释:用冒泡排序的思想,通过多次两两比较交换,实现从矮到高排序。

题目 6:给三个字母按 ASCII 码排序

题目描述:输入三个小写字母(a-z),按 ASCII 码从小到大排序(a 最小,z 最大)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    char a, b, c, t;
    cin >> a >> b >> c;
    if (a > b) { t = a; a = b; b = t; }
    if (a > c) { t = a; a = c; c = t; }
    if (b > c) { t = b; b = c; c = t; }
    cout << a << " " << b << " " << c;
    return 0;
}

解释:字符可以直接比较 ASCII 码值,通过三次比较交换实现从小到大排序。

题目 7:按数量排序(苹果、香蕉、橙子的数量)

题目描述:输入苹果、香蕉、橙子的数量(整数),按数量从少到多输出对应的水果名称(数量相同则按苹果 < 香蕉 < 橙子)。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c;  // a:苹果, b:香蕉, c:橙子
    cin >> a >> b >> c;
    // 先比较数量,数量相同则按预设顺序
    if (a <= b && a <= c) {
        cout << "苹果 ";
        if (b <= c) cout << "香蕉 " << "橙子";
        else cout << "橙子 " << "香蕉";
    } else if (b <= a && b <= c) {
        cout << "香蕉 ";
        if (a <= c) cout << "苹果 " << "橙子";
        else cout << "橙子 " << "苹果";
    } else {
        cout << "橙子 ";
        if (a <= b) cout << "苹果 " << "香蕉";
        else cout << "香蕉 " << "苹果";
    }
    return 0;
}

解释:先判断数量最小值对应的水果,再处理剩余两个,实现按数量排序。

题目 8:给三个数排序并标记位置(原位置 1,2,3)

题目描述:输入三个数,按从小到大排序后,输出每个数原来的位置(如输入 5 3 7,输出 "2 (3) 1 (5) 3 (7)")。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, p1=1, p2=2, p3=3, t, tp;
    cin >> a >> b >> c;
    // 交换数值时同时交换位置标记
    if (a > b) {
        t = a; a = b; b = t;
        tp = p1; p1 = p2; p2 = tp;
    }
    if (a > c) {
        t = a; a = c; c = t;
        tp = p1; p1 = p3; p3 = tp;
    }
    if (b > c) {
        t = b; b = c; c = t;
        tp = p2; p2 = p3; p3 = tp;
    }
    cout << p1 << "(" << a << ") " << p2 << "(" << b << ") " << p3 << "(" << c << ")";
    return 0;
}

解释:排序时不仅交换数值,还同步交换位置标记,最后输出带原位置的排序结果。

题目 9:按年龄排序(三个小朋友的年龄)

题目描述:输入三个小朋友的年龄(整数),按年龄从大到小排序,年龄相同则按输入顺序。
代码

cpp

运行

#include <iostream>
using namespace std;
int main() {
    int a, b, c, t;
    cin >> a >> b >> c;
    // 从大到小排序
    if (a < b) { t = a; a = b; b = t; }
    if (a < c) { t = a; a = c; c = t; }
    if (b < c) { t = b; b = c; c = t; }
    cout << a << " " << b << " " << c;
    return 0;
}

解释:通过三次比较交换,实现年龄从大到小排序,年龄相同时不交换(保持输入顺序)。

题目 10:给 0-9 中的三个数字按字典序排序

题目描述:输入三个 0-9 的数字,按字典序(即字符串顺序)排序(如 1、10、2,字典序是 1、10、2)。
代码

cpp

运行

#include <iostream>
#include <string>
using namespace std;
int main() {
    string a, b, c, t;  // 用字符串存储数字
    cin >> a >> b >> c;
    if (a > b) { t = a; a = b; b = t; }
    if (a > c) { t = a; a = c; c = t; }
    if (b > c) { t = b; b = c; c = t; }
    cout << a << " " << b << " " << c;
    return 0;
}

解释:将数字作为字符串处理,利用字符串比较的字典序规则进行排序,适合特殊排序需求。