2 条题解

  • 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;
    }
    

    信息

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