其实这道题不是很难 但是我还是用的比较暴力的方法
先是将等差数列中的数字全部置1,再打出素数表,两两之间联系就可解决问题。下面就是我的代码。。。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
#define Max 1000002
int isp[Max];
int num[Max];
int ish[Max];
int numb[Max];
void isprim()
{
int i,j;
isp[1]=0;
for(i=5;i<Max;i++)
{
if(i%4==1)isp[i]=1;
}
int t;
t=(int)sqrt(Max*1.0);
for(i=5;i<=t;i+=4)
{
if(isp[i])
{
for(j=5;j<Max;j+=4)
{
if(i*j>Max)
break;
isp[i*j]=0;
}
}
}
}
void nums()
{
int maxn=0;
int i,j;
for(i=0;i<Max;i++)
{
if(isp[i]==1)
numb[maxn++]=i;
}
for(i=0;i<maxn;i++)
{
for(j=0;j<maxn;j++)
{
if(numb[i]*numb[j]>Max)
break;
ish[numb[i]*numb[j]]=1;
}
}
int number=0;
for(i=0;i<Max;i++)
{
if(ish[i]==1)number++;
num[i]=number;
}
}
int main()
{
int n;
isprim();
nums();
while(scanf("%d",&n)&&n)
{
printf("%d %d\n",n,num[n]);
}
return 0;
}