• C++
  • 备战CSP-J初赛21天打卡计划。第一天-练习题答案。

  • @ 2024-8-31 10:29:19

DAY1-二进制

快问快答 题目数量 X 2

1、D  2、B

历年真题

1-5:AABDD
6-10:BBACA
11:B

进制转换

1、程序阅读题

1-6:BBADBD

选择题:

2-7:CCADDD

位运算

1、程序阅读题

16-21:ABBBBB

2单选题:

2-3:BD

1 条评论

  • @ 2024-8-31 14:38:56

    进制转换 程序阅读题解析:

    #include <iostream>
    using namespace std;
    
    long long n, ans;
    int k, len;
    long long d[1000000];
    
    int main() {
      cin >> n >> k; // 读取输入的n和k
      d[0] = 0; // 初始化第一个位置的数字为0
      len = 1; // 初始化长度为1
      ans = 0; // 初始化进位次数为0
    
      for (long long i = 0; i < n; ++i) {
        ++d[0]; // 每次循环将第一个位置的数字加1
        for (int j = 0; j + 1 < len; ++j) {
          if (d[j] == k) { // 如果某个位置的数字达到k
            d[j] = 0; // 将该位置的数字重置为0
            d[j + 1] += 1; // 下一个位置的数字加1
            ++ans; // 进位次数加1
          }
        }
        if (d[len - 1] == k) { // 如果最高位的数字达到k
          d[len - 1] = 0; // 将最高位的数字重置为0
          d[len] = 1; // 新增一个位置,数字为1
          ++len; // 长度加1
          ++ans; // 进位次数加1
        }
      }
      cout << ans << endl; // 输出总的进位次数
      return 0;
    }
    

    这段代码的主要功能是计算在处理一系列数字时,需要进行多少次进位操作。具体来说,代码模拟了一个进位系统,其中每个位置上的数字最大为k-1,当某个位置上的数字达到k时,就会发生进位。

    详细步骤

    1. 输入读取​:
      • cin >> n >> k;:读取输入的nkn表示要处理的数字个数,k表示每个位置上的数字最大值。
    2. 初始化​:
      • d[0] = 0;:初始化第一个位置的数字为0。
      • len = 1;:初始化长度为1。
      • ans = 0;:初始化进位次数为0。
    3. 处理数字​:
      • 使用一个for循环处理n个数字。
      • ++d[0];:每次循环将第一个位置的数字加1。
      • 使用一个嵌套的for循环检查每个位置的数字是否达到k
        • if (d[j] == k):如果某个位置的数字达到k,则进行进位操作。
        • d[j] = 0;:将该位置的数字重置为0。
        • d[j + 1] += 1;:下一个位置的数字加1。
        • ++ans;:进位次数加1。
      • if (d[len - 1] == k):如果最高位的数字达到k,则进行进位操作。
        • d[len - 1] = 0;:将最高位的数字重置为0。
        • d[len] = 1;:新增一个位置,数字为1。
        • ++len;:长度加1。
        • ++ans;:进位次数加1。
    4. 输出结果​:
      • cout << ans << endl;:输出总的进位次数。

    示例输入输出

    输入​:

    复制

    5 3

    输出​:

    复制

    2

    总结

    这段代码通过模拟进位系统,计算在处理n个数字时需要进行多少次进位操作。时间复杂度为O(n * len),其中len是进位系统的长度。

    • 1