C++编程练习

C++编程练习

一些典型/有趣的C++编程练习

  1. 实心菱形
    题目描述:打印 n 阶实心菱形
    输入描述:输入一个整数n,0 < n <= 10
    输出描述:输出 n 阶实心菱形 , 占 2*n-1 行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    using namespace std;

    int main() {
    int n = 0;
    cin >> n;
    if (n > 0 && n <= 10) {
    for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= 2 * n - 1; j++) {
    if (j > n - i && j < n + i)
    cout << "*";
    else
    cout << " ";
    }
    cout << endl;
    }

    for (int i = n - 1; i >= 1; i--) {
    for (int j = 1; j <= 2 * n - 1; j++) {
    if (j > n - i && j < n + i)
    cout << "*";
    else
    cout << " ";
    }
    cout << endl;
    }
    }

    return 0;
    }
  2. 螺旋数字正方形
    题目描述:打印螺旋数字正方形
    输入描述:输入一个整数n,1<=n<=31
    输出描述:输出数字正方形。每个数字占4个字符,右对齐,不全则补足空格。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <iomanip>

    void SpiralSquare(int **matrix, int x, int y, int start, int n) {
    if (n <= 0)
    return;
    if (n == 1) {
    matrix[x][y] = start;
    return;
    }

    for (int j = y; j < n + y - 1; ++j) // 上
    matrix[x][j] = start++;
    for (int i = x; i < n + x - 1; ++i) // 右
    matrix[i][n + y - 1] = start++;
    for (int j = n + y - 1; j > y; --j) // 下
    matrix[n + x - 1][j] = start++;
    for (int i = n + x - 1; i > x; --i) // 左
    matrix[i][y] = start++;

    SpiralSquare(matrix, x + 1, y + 1, start, n - 2);
    }

    int main() {
    int n;
    cin >> n;
    if (n >= 1 && n <= 31) {
    int **matrix = new int*[n];
    for (int i = 0; i < n; i++)
    matrix[i] = new int[n];

    SpiralSquare(matrix, 0, 0, 1, n);

    for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++)
    cout << setw(4) << matrix[i][j];
    cout << endl;
    }
    }
    return 0;
    }
  3. 汉诺塔
    有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
    Hanio

    将n个盘子从A针移到C针可以分解为三个步骤:

    • 将A上n-1个盘子移到B针上(借助C针);
    • 把A针上剩下的一个盘子移到C针上;
    • 将n-1个盘子从B针移到C针上(借助A针)。

    因此该过程可用递归实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <iostream>
    using namespace std;

    void move(char src, char dest) {
    cout << src << " --> " << dest << endl;
    }

    void hanoi(int n, char src, char medium, char dest) {
    if (n == 1)
    move(src, dest);
    else {
    hanoi(n - 1, src, dest, medium);
    move(src, dest);
    hanoi(n - 1, medium, src, dest);
    }
    }

    int main() {
    int m;
    cout << "Enter the number of diskes: ";
    cin >> m;
    cout << "The steps to moving " << m << " diskes:" << endl;
    hanoi(m, 'A', 'B', 'C');
    return 0;
    }
  4. 明明的随机数
    输入:随机数个数 随机数(N不大于1000)
    输出:去重、排序后的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    using namespace std;

    int main() {
    int sum, num;
    while (cin >> sum) {
    int a[1001]{ 0 };
    while (sum--) {
    cin >> num;
    a[num] = 1;
    }

    for (int i = 0; i < 1001; i++)
    if (a[i])
    cout << i << endl;
    }
    }
  5. 简单错误记录
    输入:一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开
    输出:将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开
    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序
    如果超过8条记录,则只输出前8条记录
    如果文件名的长度超过16个字符,则只输出后16个字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <iostream>
    #include <string>
    #include <vector>
    #include <utility>
    #include <algorithm>
    using namespace std;

    bool Compare(pair<string, int> a, pair<string, int> b) {
    return a.second > b.second;
    }

    int main() {
    string str, file;
    vector<pair<string, int>> errors;

    while (getline(cin, str)) {
    unsigned int pos = str.rfind("\\");
    file = str.substr(pos + 1);
    errors.push_back(make_pair(file, 1));
    for (int i = 0; i < (errors.size() - 1); i++)
    if (file == errors[i].first) {
    errors[i].second++;
    errors.pop_back();
    }
    }
    stable_sort(errors.begin(), errors.end(), Compare);

    for (int i = 0; i < errors.size() && i < 8; i++) {
    int pos = errors[i].first.find(' ');
    if (pos > 16)
    errors[i].first.erase(0, pos - 16);
    cout << errors[i].first << " " << errors[i].second << endl;
    }
    }
  6. 质数因子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <cmath>
    using namespace std;

    int main() {
    long num;
    while (cin >> num) {
    for (int i = 2; i < sqrt(num); i++) {
    while (num % i == 0) {
    cout << i << " ";
    num /= i;
    }
    }

    if (num > 1)
    cout << num;
    }
    return 0;
    }
  7. 最大公约数
    辗转相除法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    using namespace std;

    int main() {
    int a, b;
    while (cin >> a >> b) {
    int r = 0;
    while (b != 0) {
    r = a % b;
    a = b;
    b = r;
    }
    cout << a << endl;
    }
    }
  8. 删数
    输入:N,数组a[N]顺序存放0~N-1
    输出:每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置

    1. 常规方法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      #include <iostream>
      #include <vector>

      using namespace std;

      int main() {
      int N;
      vector<int> arr;
      while(cin >> N) {
      int count = 0, len = 0;
      int index = 0, lastIndex = 0;

      for (int i = 0; i < N; i++)
      arr.push_back(i);
      len = N;

      while (len) {
      if (arr[index] != N) {
      if (count++ == 2) {
      count = 0;
      arr[index] = N;
      len--;
      lastIndex = index;
      }
      }
      index = (index + 1) % N;
      }
      cout << lastIndex << endl;
      arr.clear();
      }
      }
      1. 巧用队列:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        #include <iostream>
        #include <queue>

        using namespace std;

        int main() {
        int N;
        queue<int> q;
        while(cin >> N) {
        int count = 0;
        for (int i = 0; i < N; i++)
        q.push(i);
        while (q.size() > 1) {
        if (count++ != 2) {
        q.push(q.front());
        q.pop();
        }
        else {
        q.pop();
        count = 0;
        }
        }
        cout << q.front() << endl;
        q.pop();
        }
        }

参考资料

  1. C++语言程序设计基础-学堂在线
  2. C++ Primer
  3. 牛客网

更新历史:
2019.08.03 开始整理

# CPP, CS

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×