1 条题解

  • 0
    @ 2025-4-8 20:38:01

    题目分析

    这道题目要求我们生成一个特殊的幸运数字序列,其生成规则类似于筛法,但每次筛选的步长由当前幸运数字决定。具体来说,初始时有一个从2开始的连续整数序列,然后按照以下步骤生成幸运数字:

    1. 将序列的第一个数字作为幸运数字。
    2. 从序列中删除该数字后面的每隔 kk 个数字(kk 为当前幸运数字的值)。
    3. 对剩下的序列重复上述过程,直到生成足够的幸运数字。

    方法思路

    1. 初始化序列:生成一个足够大的初始序列,包含从2开始的连续整数。
    2. 筛选过程:使用一个标记数组 arr 来标记哪些数字被筛除。初始时所有数字未被筛除(arr[i] = 0)。
    3. 生成幸运数字:遍历序列,对于每个未被筛除的数字,将其作为幸运数字,并标记其后面的每隔 kk 个数字为筛除状态(arr[k] = 1)。
    4. 存储幸运数字:将生成的幸运数字存储在数组 lucky 中。
    5. 输出结果:根据输入的 nn,直接输出第 nn 个幸运数字。

    解决代码

    #include <iostream>  
    using namespace std;  
    #define N 35000  
     int main()  
    {  
        int arr[N]={0};
                        
        int lucky[N];  
        int i,j,k,n;  
        n = 0;  
        for (i=2;i<N;i++)
        {  
            if(0 == arr[i])
            {  
                lucky[n++] = i;
                k = i+1;
                j = 0;
                while(k<N)
                {  
                    if(arr[k]==0)
                    {  
                        j++;
                    }  
                    if(i==j)  
                    {  
                        arr[k] = 1;
                        j = 0;              
                    }  
                    k++; 
                }  
            }  
        }  
        while (cin>>n&&n)  
        {  
           cout<<lucky[n-1]<<endl;  
        }  
        return 0;  
    } 
    
    • 1

    信息

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