#include<iostream>
using namespace std;
bool str[100010]; //开始定义一个全局变量数组
void prime() //这个函数可以将1~100010内的所有素数都找出来,所以在main()函数开头执行一遍就行了
{
str[1] = 1;
for(int i=2;i*i<=100010;i++) //优化点1:
{
if(!str[i]) //优化点2:
{
for(int j=i*i;j<=100010;j+=i) //优化点3:
str[j] = 1;
}
}
}
int main()
{
prime(); //执行程序开始的打表操作
int n;
while(cin>>n)
{
if(str[n]) cout<<"不是素数!"<<endl; //判断是否为素数
else cout<<"是素数!"<<endl;
}
return 0;
}
优化点1: 范围为0~10000时,即循环到i = 100时即可,因为从100 ~ 10000中所有的非素数都是1~100中数的倍数,首先要先找到一个100 ~ 10000中的非素数,那么它除了1和它本身,应该还会有1个或多个因子,假设其中一个因子在10000中间,那么与其对应的另外一个因子一定在100中间否则两个数相乘会大于10000,比如9999,他的一个因子是101,那么对应的另外一个因子就是99,该数会在第二层循环完成标记
优化点2:当i不是素数时,会产生重复标记
优化点3:假设刚开始i = 2的时候,是不是把 i 的倍数都标记成1了?那么2 * 3肯定也被标记成1了,所以当 i 运行到等于3的时候就没必要在把3 * 2给标记一遍了是不?要不然就又重复标记了,同理,在 i = 4的时候,那么4 * 2 和4 3是不是在i = 2 ,i = 3 的时候分别被标记过了,所以在循环第二层的时候从j = 4 4(int j = ii)开始就好了