// 按字典序输出2 到 n 的素数
// 效率由低到高
// 方法6 目前还不会 以后再加上
#include <iostream>
#include <cmath>
using namespace std;
void is_Prime_1(int n);//试除法
void is_Prime_2(int n);//试除法
void is_Prime_3(int n);//试除法
void is_Prime_4(int n);//试除法
void is_Prime_5(int n);//试除法
void is_Prime_6(int n);//试除法
void is_Prime_7(int n);//筛选法
void is_Prime_8(int n);//打表法
int main(int argc, const char * argv[])
{
int n;
cin >> n;
is_Prime_1(n);
is_Prime_2(n);
is_Prime_3(n);
is_Prime_4(n);
is_Prime_5(n);
is_Prime_6(n);
is_Prime_7(n);
is_Prime_8(n);
return 0;
}
void is_Prime_1(int n)
{
for(int j = 2; j <= n; j++)
{
int i = 2;
for(; i <= j - 1; i++)
{
if(j % i == 0)
break;
}
if(i > j - 1)
cout << j << " ";
}
cout << endl;
}
void is_Prime_2(int n)
{
for(int j = 2; j <= n; j++)
{
int i = 2;
for(; i <= j >> 1; i++)
{
if(j % i == 0)
break;
}
if(i > j >> 1)
cout << j << " ";
}
cout << endl;
}
void is_Prime_3(int n)
{
cout << "2 ";
for(int j = 3; j <= n; j += 2)
{
int i = 3;
for(; i <= j >> 1; i++) // >> 位运算 相当于 除2 效率更高
{
if(j % i == 0)
break;
}
if(i > j >> 1)
cout << j << " ";
}
cout << endl;
}
void is_Prime_4(int n)
{
for(int j = 2; j <= n; j++)
{
int i = 2;
for(; i <= sqrt(j); i++)
{
if(j % i == 0)
break;
}
if(i > sqrt(j))
cout << j << " ";
}
cout << endl;
}
void is_Prime_5(int n)
{
cout << "2 ";
for(int j = 3; j <= n; j += 2)
{
int i = 3;
for(; i <= sqrt(j); i++)
{
if(j % i == 0)
break;
}
if(i > sqrt(j))
cout << j << " ";
}
cout << endl;
}
void is_Prime_6(int n)//空间换时间
{
cout << "空间换时间" << endl;
// 尝试从 3 到√x 的所有奇数,还是有些浪费。
// 比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3,5,7,9。但是你发现没有,对9的尝试是多余的。不能被3整除,必然不能被9整除......顺着这个思路走下去,就会发现:其实,只要尝试小于√x 的质数即可。而这些质数,恰好前面已经算出来了
}
void is_Prime_7(int n)//筛选法
{
bool prime[10000];
fill(prime, prime + 10000, true);
for(int i = 3; i <= n; i++)
{
if(i % 2 == 0)
prime[i] = false;
}
for(int i = 3; i <= sqrt(n); i += 2)
{
if(prime[i])
{
for(int j = i + i; j <= n; j += i)
prime[j] = false;
}
}
for(int i = 2; i <= n; i++)
{
if(prime[i])
cout << i << " ";
}
cout << endl;
}
void is_Prime_8(int n)
{
cout << "打表" << endl;
}