8-FCxNfOuUU6NV7V5.png

开灯问题

  • 问题描述:

    n盏灯,编号1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数的开关,第三个人按下所有编号为3的倍数的开关,以此类推,一共有k个人,文最后有哪些等开着,输入n和k,输出开着的灯的编号: k<=n<=1000, 编写C++程序?

例子1:
输入:

10 5

输出:

1 4 6 7 8 10

例子2:
输入:

20 7

输出:

1 4 8 10 11 12 13 14 15 16 17 19

编写一个C++程序来模拟这个问题,根据输入的n和k计算最后哪些灯开着

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, k;
    cout << "请输入灯的数量 n:";
    cin >> n;
    cout << "请输入操作次数 k:";
    cin >> k;

    vector<bool> lights(n, false);

    for (int i = 1; i <= k; ++i) {
        for (int j = i - 1; j < n; j += i) {
            lights[j] = !lights[j];
        }
    }

    cout << "最后开着的灯的编号是:";
    for (int i = 0; i < n; ++i) {
        if (lights[i]) {
            cout << i + 1 << " ";
        }
    }
    cout << endl;

    return 0;
}

这个程序首先读取输入的灯的数量n和操作次数k,然后创建一个bool型的vector来表示每盏灯的状态,初始状态都是关着的(false)。

然后,程序使用两层循环来模拟每个人的操作。外层循环迭代k次,模拟k个人的操作,内层循环按照当前人的编号(i)来切换对应编号的灯的状态。

最后,程序遍历vector,找出开着的灯的编号并输出。

对于比赛,程序应该严格按照题目要求,不能有多余的输入和输出; 这里为了方便演示,多了一些额外的输入与输出提示

蛇形填数

  • 问题描述:

    蛇形填数问题:在nn的方阵里面填入1, 2, ..., nn,
    要求填成蛇形,从左上角第一个格子开始,第一行开始,然后最后一列,最后一行,依次类推,构成蛇形,编写C++程序实现

例子1:
输入:

4

输出:

1       2       3       4
12      13      14      5
11      16      15      6
10      9       8       7

例子2:
请输入n的值:10
蛇形填数结果:
1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19

你可以输入不同的n和k来测试程序的功能。这个程序适用于n和k的范围在1到1000之间的情况。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cout << "请输入n的值:";
    cin >> n;

    vector<vector<int>> matrix(n, vector<int>(n, 0));

    int num = 1;
    int row = 0, col = 0;
    int direction = 0; // 0: 向右,1: 向下,2: 向左,3: 向上

    while (num <= n * n) {
        matrix[row][col] = num++;
        
        // 向右
        if (direction == 0) {
            if (col + 1 < n && matrix[row][col + 1] == 0) {
                col++;
            } else {
                direction = 1;
                row++;
            }
        }
        // 向下
        else if (direction == 1) {
            if (row + 1 < n && matrix[row + 1][col] == 0) {
                row++;
            } else {
                direction = 2;
                col--;
            }
        }
        // 向左
        else if (direction == 2) {
            if (col - 1 >= 0 && matrix[row][col - 1] == 0) {
                col--;
            } else {
                direction = 3;
                row--;
            }
        }
        // 向上
        else if (direction == 3) {
            if (row - 1 >= 0 && matrix[row - 1][col] == 0) {
                row--;
            } else {
                direction = 0;
                col++;
            }
        }
    }

    // 输出结果
    cout << "蛇形填数结果:" << endl;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}

标签: none