蓝桥杯-幸运数 (模拟)

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

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

代码解释:首先将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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值