计数质数 六种境界(含代码实现)
以下均基于此思想
//境界一 傻子作法(也就是我)
int countPrimes(int n) {
int i,j,sushu_flag = 1,sushu_sum = 0;
for(j=2;j<n;j++)
{
for(i=2;i<j;i++)
{
if((j%i)==0)
{
sushu_flag=0;
break;
}
}
if(sushu_flag)
sushu_sum++;
sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
}
return sushu_sum;
}
//境界2 除二做法(还是不满足题目要求,只减少了境界1的一半时间) 除二是因为 sushu的因子是整数 所以极限是
// 2*(素数/2)所以最小是2,最大是素数除以二。
int countPrimes(int n) {
int i,j,sushu_flag = 1,sushu_sum = 0;
for(j=2;j<n;j++)
{
for(i=2;i<=j/2;i++)//注意!!!j/2
{
if((j%i)==0)
{
sushu_flag=0;
break;
}
}
if(sushu_flag)
sushu_sum++;
sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
}
return sushu_sum;
}
//境界3 奇数做法(还是不满足题目要求,只减少了境界1的一半的一半时间)奇数指的是被判断的数字
int countPrimes(int n) {
int i,j,sushu_flag = 1,sushu_sum = 0;
for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
{
//printf("j = %d",j);
if(j == 1)sushu_flag=0;//1不是素数
for(i=2;i<=j/2;i++)
{
if((j%i)==0)
{
sushu_flag=0;
//printf("j = %d",j);
break;
}
}
if(sushu_flag)
{
sushu_sum++;
//printf("j = %d",j);
}
sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
}
if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
return sushu_sum;
}
//境界4 根号做法(满足题目要求,不满足我的好奇心)素数判定是看它的因数里面是否有除了自己和它本身的其他整数,100 的引因数 1 100;2 50;4 25;...;10 10;由此可见,两个因数一个大于等于根号100,另一个小于等于根号100.所以只要找到从2到根号100里面有没有是100的因子即可。
int countPrimes(int n) {
int i,j,sushu_flag = 1,sushu_sum = 0;
for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
{
//printf("j = %d",j);
if(j == 1)sushu_flag=0;//1不是素数
for(i=2;i<=sqrt(j);i++)
{
if((j%i)==0)
{
sushu_flag=0;
//printf("j = %d",j);
break;
}
}
if(sushu_flag)
{
sushu_sum++;
//printf("j = %d",j);
}
sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
}
if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
return sushu_sum;
}
//境界5 查表法(因为判断了3,就不用判断9了,所以直接判断素数是不是他的因子即可)把每次算的素数存到表里即可实现
int countPrimes(int n) {
int i,j,sushu_flag = 1,sushu_sum = 0;
int sushu[1000000] = {0};//存放算好的素数
sushu[0] = 2;
for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
{
//printf("j = %d",j);
if(j == 1)sushu_flag=0;//1不是素数
for(i=0;sushu[i]!=0&&sushu[i]<=sqrt(j);i++)//每次只要判断小于根号100的素数即可
{
if((j%sushu[i])==0)
{
sushu_flag=0;
//printf("j = %d",j);
break;
}
}
if(sushu_flag)
{
sushu_sum++;
sushu[sushu_sum] = j;//每次算完把素数存到素数数组中
//printf("j = %d",j);
}
sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
}
if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
return sushu_sum;
}
//境界6 筛选法 把合数(也就是非素数全部都筛掉即可)
int countPrimes(int n) {
int sushu_sum = 0;
//char bit_array[] = {0};
bool Bit_array[10000000];
long long i,j;
if(n==0)return 0;
Bit_array[0] = false;Bit_array[1] = false;//0和1都是合数
for( i=2; i<=n; ++i)
Bit_array[i] = true;//初始化数组
for( i=2; i<=n; ++i)//找到合数
if(Bit_array[i]) // if i is prime number
for( j=i*i; j<=n; j+=i)
Bit_array[j] = false;
for( i=2; i<n; ++i){//计数
if(Bit_array[i])
sushu_sum++;
}
return sushu_sum;
}