【问题描述】
输入一正整数n(n<=10000),按顺序输出2到n范围内的所有个位为1的素数prime。
prime数组搭配primeSize数字记录素数数量的方法值得学习。
#include<stdio.h>
using namespace std;
//素数集合
int prime[10000];
int primeSize=0;
int mark[10001];
//若mark[i]为1,表明其是非素数
void init()
{
//初始化
for(int i=0;i<10001;i++)
{
mark[i]=false;
}
primeSize=0;
//必须要注意,这里i从2开始,如果错写成了从1开始就会导致所有数都会被标成true非素数!
for(int i=2;i<10000;i++)
{
if(mark[i])
{
continue;
}
else
{//标记该素数的倍数为非素数
prime[primeSize++]=i;
//这个循环的渐增、起始、结束条件都值得注意,都不是直接写的
//尤其是起始和渐增写法 i*i+=i 最大程度优化程序减少重复工作
for(int j=i*i;j<=10000;j+=i)
{
mark[j]=true;
}
}
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)!=EOF)
{
bool isOutput=false;
for(int i=0;i<primeSize;i++)
{
if(prime[i]%10==1&&prime[i]<n)
{
if(isOutput)
{
printf(" %d",prime[i]);
}
else
{
isOutput=true;
printf("%d",prime[i]);
}
}
}
if(!isOutput)
{
printf("-1\n");
}
else
{
printf("\n");
}
}
return 0;
}