返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 15, 主题|小节 7
进行中

15.6 真题讲解

2025年9月22日
课 进展
0% 完成

选择题

第 1 题

下面C++代码执行后的输出是( )。

int N = 10;
while(N){
    N -= 1;
    if(N%3 == 0)
        cout << N << "#";
}

□ A. 9#6#3#
□ B. 9#6#3#0#
□ C. 9#7#6#3#0#
□ D. 10#9#7#6#3#0#

答案:B. 9#6#3#0#

解析:
这段代码先将N减1,然后检查N是否能被3整除,如果能,则输出N和”#”。循环直到N变为0。

执行过程:

  • 初始N=10
  • 第一次循环:N减1变为9,9%3=0,输出”9#”
  • 第二次循环:N减1变为8,8%3≠0,不输出
  • 第三次循环:N减1变为7,7%3≠0,不输出
  • 第四次循环:N减1变为6,6%3=0,输出”6#”
  • 第五次循环:N减1变为5,5%3≠0,不输出
  • 第六次循环:N减1变为4,4%3≠0,不输出
  • 第七次循环:N减1变为3,3%3=0,输出”3#”
  • 第八次循环:N减1变为2,2%3≠0,不输出
  • 第九次循环:N减1变为1,1%3≠0,不输出
  • 第十次循环:N减1变为0,0%3=0,输出”0#”

因此,最终输出是”9#6#3#0#”。

编程题

编程题1:找因数

问题描述

小A最近刚刚学习了因数的概念。具体来说,如果一个正整数a可以被另一个正整数b整除,那么我们就说b是a的因数。

请你帮写一个程序,从小到大输出正整数a的所有因数。

输入描述

输入一行一个正整数a。保证a ≤ 1,000。

输出描述

输出若干行,为a的所有因数,从小到大排列。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯,但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。

样例输入1
1
样例输出1
1
样例输入2
6
样例输出2
1
2
3
6
样例输入3
10
样例输出3
1
2
5
10
解题思路
  1. 读取正整数 a
  2. 从 1 到 a 遍历,检查每个整数 i 是否为 a 的因数
  3. 如果 a % i == 0,则 i 是 a 的因数,将其输出
  4. 按从小到大的顺序输出所有因数
代码实现
#include <iostream>
using namespace std;

int main() {
    int a;                      // 定义变量a,存储输入的整数
    cin >> a;                   // 输入整数a
    
    int i = 1;                  // 初始化测试值为1
    while (i <= a) {            // 当i小于等于a时继续循环
        if (a % i == 0) {       // 检查i是否为a的因数
            cout << i << endl;   // 如果是因数,则输出i
        }
        i++;                    // i自增1,测试下一个整数
    }
    
    return 0;
}
代码分析
  • 使用取模运算(%)检查整除性,判断因数关系
  • while循环版本需要手动初始化和递增循环计数器i
  • 输出采用逐行打印方式,每个因数占一行
  • 时间复杂度为O(n),其中n为输入的正整数a
注意事项
  • 循环范围需要包含1和a本身,因为它们都是a的因数
  • 确保按从小到大的顺序输出因数
  • 根据题目要求,不要输出任何提示信息
  • 对于较大的输入值,O(n)的算法可能效率不高
  • 每个因数需要单独占一行输出
关键点
  • 理解因数的定义:b是a的因数当且仅当a能被b整除
  • 使用取模运算符(%)检查整除性
  • 遍历方法的选择(从1到a逐个检查)
  • 输出格式的严格控制
  • 对于特殊输入(如1)的正确处理

编程题2:小杨报数

问题描述

小杨需要从1到N报数。在报数过程中,小杨只报哪些M的倍数。例如,如果N = 5,M = 2,那么小杨就只需要报出1、3、5。

现在,请你代替小杨报数。

输入描述

输入2行,第一行一个整数N(1 ≤ N ≤ 1,000);第二行一个整数M(2 ≤ M ≤ 100)。

输出描述

输出若干行,依次表示小杨的报数。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯,但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。

样例输入1

5
2

样例输出1

1
3
5

样例输入2

10
3

样例输出2

1
2
4
5
7
8
10

解题思路

  1. 读取整数N和M
  2. 从1到N遍历每个整数
  3. 对于每个整数i,检查i是否不是M的倍数(i % M != 0)
  4. 如果i不是M的倍数,则输出i
  5. 按顺序输出所有符合条件的数

代码实现

#include <stdio.h>

int main(int argc, char **argv) {
    int n, m;                   // 定义变量n和m
    scanf("%d", &n);            // 输入整数n
    scanf("%d", &m);            // 输入整数m
    
    int i = 1;                  // 初始化循环变量为1
    while(i <= n) {             // 当i小于等于n时继续循环
        if(i % m != 0)          // 检查i是否不是m的倍数
            printf("%dn", i);   // 如果不是m的倍数,则输出i
        i++;                    // i自增1
    }
    
    return 0;
}

代码分析

  • 使用条件判断(i % m != 0)筛选需要报出的数字
  • while循环版本需要手动管理循环变量i
  • 使用printf函数输出结果,每个数字占一行
  • 每次判断都是独立的,时间复杂度为O(n)

注意事项

  • 理解”报不是M的倍数”的含义:输出那些不能被M整除的数
  • 确保输出格式正确,每个数字占一行
  • 不要添加任何提示性文字,只输出纯数字
  • 循环范围必须是从1到N
  • 对于大数据量输入,时间复杂度为O(n)

关键点

  • 使用取模运算(%)判断数字是否为另一个数的倍数
  • 理解逻辑:报出的是那些”不是M的倍数”的数
  • 输出格式的控制:每个数字单独占一行
  • 循环边界的设置:从1到N
  • 条件判断的准确性