题目:
主要思路:
运用递归和循环语句维护a数组,也就是用a[i]数组储存最终答案最后遍历a数组输出答案。
具体的细节可以看注释
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int m,n,ans,a[maxn];
void Change(int p){
int q=p;
if(a[p]>n) return;//如果这里的数大于n,也就是题目要求的最大的数,就可以退出了
for(int i=p+1;i<=n;i++)//这里是第i个位置对当前幸运数取余不为,也就是不可以整除幸运数时,将这第i个位置的数放到a数组的下一个位置
if(i%a[p]) a[++q]=a[i];
Change(p+1);//进行下一个幸运数的变化
}
int main(){
cin>>m>>n;
for(int i=1;i<=maxn;i++)//这里先储存一开始的数组,也就是幸运数为2时,把当前位置能整除2的除去,也就是全是奇数的a数组
a[i]=2*i-1;
Change(2);
for(int i=1;i<=maxn;i++)//搞完之后就可以遍历在m和n之间的数有多少个了
if(a[i]<n&&a[i]>m)
ans++;
cout<<ans;
return 0;
}