九度1163素数
本程序来自九度1163题.
- 素筛法简介
- C程序实现
素筛法简介
我们按如下思路考虑:
若一个数不是素数,则必存在一较小的数为因数。
假如获得了小于一个数的所有素数,只需确定该数不能被这些素数整除,这个数即为素数。
在获得一个素数时我们将其所有倍数标记为非素数,这样当我们遍历到一个数时,它没有被任何小于它的素数标记,则确定为素数
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
using namespace std;
int hasht[15001] = { 0 };
int mark[15001] = { 0 };
void init(){
int i, k = 0, n = 2;
for (i = 0; i < 15001; i++){
mark[i] = 1;
}
//mark[2] = 1;
for (i = 2; i < 15001; i++){
if (mark[i] == 0) continue;
mark[i] = 1;
hasht[k++] = i;
//int tm = i*n++;
n = 2;
while (i*n <= 15000)
mark[i*n++] = 0;
}
}
int main(){
init();//初始化所有素数
int n = 0;
while (scanf("%d",&n)!=EOF){
int flag = 0;
for (int i = 0; hasht[i] < n; i++)
{
if (hasht[i] % 10 == 1 && !flag)//注意输出格式
{
cout << hasht[i];
flag = 1;
}
else if (hasht[i] % 10 == 1 && flag){
cout << " " << hasht[i];
}
}
if (!flag) cout << "-1";
cout << endl;
}
return 0;
}