题目描述
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成
。
首先从1开始写出自然数1,2,3,4,5,6,…
1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 …
把它们缩紧,重新记序,为:
1 3 5 7 9 … 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, …
此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,…)
最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, …
输入
输入两个正整数m n, 用空格分开 (m < n < 1000*1000)
输出
程序输出 位于m和n之间的幸运数的个数(不包含m和n)。
样例输入
30 69
样例输出
8
c语言AC代码
#include <stdio.h>
#include <math.h>
int a[1000050],n,m,i,j,cou=0,c=0;
int main()
{
scanf("%d%d",&m,&n);
if(n-m<=1)
{
printf("%d",cou);
return 0;
}
a[1]=1;
for(i=2;i<=n&&a[i-1]<=n;i++) //直接使用计数,a[2]=2时,所有的偶数都没有了
a[i]=a[i-1]+2;
for(i=2;i<=n;i++) //假设比那里所有a[i],每个都当一次幸运数字,且不为0
{ if(a[i]==0) //为0继续加一
continue;
for(j=i;j<=n;j++) //序号能够整除幸运数字的标为0,包括幸运数字自身的序号也要计算
{
if(j%a[i]==0&&a[j]!=0)
a[j]=0;
}
for(j=i;j<=n;j++) //找出第一个为0 的位置
{
if(a[j]==0)
{
c=j;
break;
}
}
// printf("%d\n",c);
j=c;
while(j<=n) //将后面不为0的数字移到前面来
{
while(a[j]==0&&j<=n)
j++;
a[c]=a[j];
a[j]=0;
c++;
}
// printf("%d\n",j);
/* for(j=1;j<=n;j++)
printf("%d ",a[j]);
printf("\n ");
return 0;*/
if(i>n)
break;
}
/*for(j=1;j<=n;j++)
if(a[j]!=0)
printf(" %d ",a[j]);
printf("\n ");*/
for(j=1;j<=n;j++) //统计个数
if(a[j]>m&&a[j]<n&&a[j]!=0)
cou++;
printf("%d",cou);
}