求最高效最简单的判断一个整数是否为质数的算法

number1170196649 2012-11-23 04:13:07
受埃拉托色尼筛算法的启发,我们判断素数的时候能否跳过对于4、6、8、9等等的判断呢?因为2、3判断的时候他们可以跳过。如何实现?我采用是跳过2的倍数的算法,算法本身有点庞大,不如2到根号n的判断简介。献丑了:
// 判断n是否为质数
bool IsPrimeNumber(int n)
{
if (n==2)
{
return true;
}

if (n%2==0)
{
return false;
}

int sqrtn=(int)sqrt((double)n);
bool flag=true;

for (int i=3;i<=sqrtn;i+=2)
{
if (n%i==0)
{
flag=false;
}
}
return flag;
}
...全文
10809 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 zfk198687 的回复:
以下是百度百科上的,我无节操的粘贴过来了

效率比较高的素数判断方法(C++版本)
#include<iostream>   
#include<cmath>   
using namespace std;   

bool prime( int num)   
{   
    if (num==2||num==3||num==5) 
       return true;   
    unsigned long c=7;   
    if (num%2==0||num%3==0||num%5==0||num==1) 
        return false;   
    int maxc=int(sqrt(num));   
    while (c<=maxc)   
    {   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=6;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=6;   
    }   
    return true;   
}   

int main()   
{   
    int num;   
    cin>>num;   
    if (prime(num)) 
       cout<<num<<" is a prime number."<<endl;   
    else 
       cout<<num<<" is not a prime number."<<endl;   
    return 0;   
}
我自己稍微修改了下,只用前加4和加2,效果也很好
number1170196649 2012-11-24
  • 打赏
  • 举报
回复
引用 10 楼 mujiok2003 的回复:
//鉴于sqrt和除法都比较慢 C/C++ code?123456789101112131415161718192021222324252627bool isPrime(size_t n){ static size_t const smallPrimes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 3……
这个叫做以空间换时间技术吗?
cbzjzsb123 2012-11-24
  • 打赏
  • 举报
回复
这个叫做以空间换时间技术吗?
cjfeii 2012-11-23
  • 打赏
  • 举报
回复
引用 4 楼 number1170196649 的回复:
引用 2 楼 zfk198687 的回复:以下是百度百科上的,我无节操的粘贴过来了 C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354效率比较高的素数判断方法(C++版本)#include<iostre……
你从11开始加一遍就知道啦
mujiok2003 2012-11-23
  • 打赏
  • 举报
回复
引用 10 楼 mujiok2003 的回复:
//鉴于sqrt和除法都比较慢 C/C++ code?123456789101112131415161718192021222324252627bool isPrime(size_t n){ static size_t const smallPrimes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 3……
可以适当增加已知的质数个数来提高效率
mujiok2003 2012-11-23
  • 打赏
  • 举报
回复
//鉴于sqrt和除法都比较慢
bool isPrime(size_t n)
{
	static size_t const smallPrimes[] = { 
		2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
		61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
		137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
		211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
		283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373,
		379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 
		461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
		563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
		643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
		739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827,
		829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 
		937, 941, 947, 953, 967, 971, 977, 983, 991, 997
	};
	static size_t const smallPrimesNo = sizeof(smallPrimes)/sizeof(smallPrimes[0]);
	for(size_t i = 0; i < smallPrimesNo && smallPrimes[i] <= n; ++i)
	{
	  if(smallPrimes[i] == n)
	  {
		return true;
	  }	   
	}
	//TODO: generic algorithim goes here
	return false;
}
转角天边 2012-11-23
  • 打赏
  • 举报
回复
引用 7 楼 number1170196649 的回复:
引用 6 楼 anhuizhuanjiao 的回复:除2之外的偶数都不是素数,直接return 下面循环变量一次加2 赞个少检测了一半,但是3、5的倍数如何跳过?
if (num%2==0||num%3==0||num%5==0) 这个不是有吗 循环变量每次就加6
FancyMouse 2012-11-23
  • 打赏
  • 举报
回复
这东西。高效的不简单,简单的不高效。
number1170196649 2012-11-23
  • 打赏
  • 举报
回复
引用 6 楼 anhuizhuanjiao 的回复:
除2之外的偶数都不是素数,直接return 下面循环变量一次加2 赞个
少检测了一半,但是3、5的倍数如何跳过?
转角天边 2012-11-23
  • 打赏
  • 举报
回复
除2之外的偶数都不是素数,直接return 下面循环变量一次加2 赞个
zfk198687 2012-11-23
  • 打赏
  • 举报
回复
引用 4 楼 number1170196649 的回复:
引用 2 楼 zfk198687 的回复: 以下是百度百科上的,我无节操的粘贴过来了 C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354效率比较高的素数判断方法(C++版本)#include<iostream>   #incl……
if (num%2==0||num%3==0||num%5==0||num==1) return false; 排除了2、3和5的倍数。 在while循环中,按照里面的加法,c从7开始增长直到c<maxc,直接跳过了2、3和5的倍数。 我不知道为什么这么加能跳过他们的倍数,可能是个规律?不是很清楚!
number1170196649 2012-11-23
  • 打赏
  • 举报
回复
引用 2 楼 zfk198687 的回复:
以下是百度百科上的,我无节操的粘贴过来了 C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354效率比较高的素数判断方法(C++版本)#include<iostream>   #include<cmath>……
加2、加4、加6是如何区分的呢?
newtee 2012-11-23
  • 打赏
  • 举报
回复
分成了奇数和偶数 但是效果还是和原来差不多
zfk198687 2012-11-23
  • 打赏
  • 举报
回复
以下是百度百科上的,我无节操的粘贴过来了

效率比较高的素数判断方法(C++版本)
#include<iostream>   
#include<cmath>   
using namespace std;   

bool prime( int num)   
{   
    if (num==2||num==3||num==5) 
       return true;   
    unsigned long c=7;   
    if (num%2==0||num%3==0||num%5==0||num==1) 
        return false;   
    int maxc=int(sqrt(num));   
    while (c<=maxc)   
    {   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=4;   
        if (num%c==0) 
           return false;   
        c+=6;   
        if (num%c==0) 
           return false;   
        c+=2;   
        if (num%c==0) 
           return false;   
        c+=6;   
    }   
    return true;   
}   

int main()   
{   
    int num;   
    cin>>num;   
    if (prime(num)) 
       cout<<num<<" is a prime number."<<endl;   
    else 
       cout<<num<<" is not a prime number."<<endl;   
    return 0;   
}
wjain 2012-11-23
  • 打赏
  • 举报
回复
不错,顶一个。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧