1 条题解

  • 0
    @ 2025-5-22 10:36:51

    题意分析​

    本题是一个关于数字处理和循环检测的问题。核心任务是根据特定规则对输入的六位整数进行一系列操作,直到出现重复数字,从而确定循环相关信息。​ 基础操作规则:对于给定的六位整数,提取中间四位数字,将其平方后只保留结果的最后六位(若结果不足六位则直接使用)。例如,对于数字 655554,提取中间四位 5555,平方得到 30858025,保留后六位为 858025。​

    检测目标:持续按照上述规则处理数字,记录每次处理后的结果。当出现与之前记录的结果重复的数字时,说明检测到循环。此时需要确定三个关键信息:循环中第一个出现的数字、循环的长度、从开始到检测到循环总共进行的迭代次数。​

    特殊情况说明:输入数字不足六位或中间四位数字提取后不足四位时,需补前导零;平方结果不足六位时,直接作为下一个处理的数字。例如数字 200023,中间四位视为 0002;其平方结果 4,保留后仍为 4。同时,程序运行时内存使用不得超过 16MB 。​

    解题思路​

    数据存储与初始化:使用字典来存储每个数字首次出现的迭代次数,初始输入的六位整数为第 0 次迭代。定义变量记录当前处理的数字、当前迭代次数、循环起始数字、循环长度和总迭代次数,并进行初始化。​

    迭代处理过程:进入循环,每次迭代时,先判断当前数字是否已在字典中出现。若未出现,则将其存入字典并记录当前迭代次数;接着按照规则提取中间四位数字,计算平方并保留后六位,得到下一个处理的数字。​

    循环检测与结果计算:当某个数字在字典中已存在时,说明检测到循环。此时,通过当前迭代次数与该数字首次出现的迭代次数之差,计算出循环长度;将当前重复数字确定为循环中第一个出现的数字;当前迭代次数即为总迭代次数。最后输出循环中第一个出现的数字、循环长度和总迭代次数。

    代码

    ```cpp
    #include <iostream>
    #include <cstring>
    #define MAX 1000001
    using namespace std;
    int a[MAX];
    int main()
    {
        int n;
        while(cin>>n)
        {
            memset(a,0,sizeof(a));
            int sum=0;
            while(1)
            {
                n=n/10;
                n=n%10000;
                n=n*n;
                n=n%1000000;
                if(a[n]!=0)
                {
                    sum++;
                    cout<<n<<" "<<sum-a[n]<<" "<<sum<<endl;
                    break;
                }
                a[n]=++sum;
                //cout<<sum<<endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1184
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者