2 条题解

  • 0
    @ 2025-7-13 9:08:41
    #include <bits/stdc++.h>
    using namespace std;
    int n, x;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> x;
        int now = x;
        int ans = 1;
        while (now % 10 != 3)
        {
            if (x % 2 == 0)
                x = x / 2;
            else
                x = x * 3 + 1;
            now += x;
            ans++;
        }
        cout << ans << "\n";
        return 0;
    }
    
    • 0
      @ 2025-7-5 11:19:49

      这道题开头给出了 1010010^{100} 的数据范围,但实际的x取值范围仅在01000\sim100之间,所以可以放心使用int进行数值模拟。
      模拟的思路参考代码的注释部分。

      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
          /* 
          * x为被传递小朋友的编号(初始x可视为第一个被传递小朋友)
          * ans为题目要求输出的传递次数
          * num为计算器当前数值
          */
          int x, ans, num;
          ans = 0;
          num = 0;
          cin >> x;
      
          /*
          * 这里使用while循环,但显然num的初始数值保证了至少能有一次执行
          * 循环条件当计算器个位数不是3时进行下一次循环(即计算器的传递)
          */
          while (num % 10 != 3) {
              /*
              * 进入当前循环节说明进行了一次传递,执行传递必定产生的操作
              * 即传递次数+1,计算器数值加上被传递小朋友的编号
              */
              ans++;
              num += x;
      
              /*
              * 从题目给于的流程来说,这里应当进行判断是否终止循环
              * 但显然从逻辑上来说这是一段废代码
              * 因为后面步骤只会改变x的值,不会影响循环终止条件的判断
              * 也不会影响结果输出(在满足终止条件的时候不会走到下一个ans++处)
              * 所以在这里终止或直接在下一次while判断时终止,结果是一样的
              */
              if (num % 10 == 3) {
                  break;
              }
      
              //由当前被传递小朋友的编号,计算下一个小朋友的编号用于下一次循环的执行
              if (x % 2 == 0) {
                  x = x / 2;
              }
              else {
                  x = 3 * x + 1;
              }
          }
      
          //输出ans的传递次数
          cout << ans;
          return 0;
      }
      
      • 1

      信息

      ID
      14262
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      72
      已通过
      41
      上传者