蓝桥杯-幸运数 (模拟)

题目大意:根据幸运数的条件,不断地将幸运数的倍数删去,留下的就是幸运数。要求的是在某个区间,幸运数的个数。

题目分析:这道题直接模拟删除的步骤,就可以得到一个幸运数的数组,然后在数组中求给定区间上的幸运数的个数即可。

代码解释:首先将2的倍数从数组中刨去,那么num数组中就只剩下1,3,5,7,9,11,13……

然后我取到数组中的第二个数,也就是3,将所有位置是3的倍数的数删掉,也就是将不是3的倍数的数保留下来。

经历了这样一次循环之后,num数组变成了1,3,7,9,13……

然后再取数组中的第三个数7,因此代码中k每次循环过后,自增1,表示这次取下一个幸运数的倍数。

最后取出给定区间上的幸运数的个数即可。

代码展示:

#include <iostream>
#include <string.h>
using namespace std;

int main(){
    int m,n;
    cin>>m>>n;
    int num[n];
    memset(num,0,sizeof(num));
    for(int i=1;i<n;i++)
        num[i] = i*2-1;  //先刨去2的倍数
    int temp = 0;
    int k=2;
    int j = 1;
    do{
        temp = num[k++];  //得到当前的幸运数,之后该幸运数的倍数会被删掉
        for(int i=1;i<n;i++){
            if(i%temp!=0)
                num[j++] = num[i]; //保留当前数组中的幸运数
        }
        j = 1;
    }while(temp<n);
    int count = 0;
    for(int i=1;i<n;i++){
        if(num[i]>=n)
            break;
        if(num[i]>m)
            count++;
    }
    cout<<count<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jaster_wisdom/article/details/79733341