判断素数方法总结

匿名 (未验证) 提交于 2019-12-03 00:25:02

time命令输出的信息

[1] real : 表示程序整个的运行耗时。可以理解为foo运行开始时刻你看了一下手表,程序运行结束时,你又看了一下手表,两次时间的差值就是本次real 代表的值 
[2]user :这个时间代表的是foo运行在用户态的cpu时间,什么意思? 
首先,我来讲一下用户态和核心态: 
核心态(Kernel Mode): 
在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。 

用户态(User Mode): 
在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的、底层的API来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。 

为什么要区分Kernel Mode 和 User Mode呢?答案是隔离保护,使得系统更稳定。 
好,讲完用户态和核心态之后,我们来看user time。我们已经说过了,这个指的是程序foo运行在用户态的cpu时间,cpu时间不是墙上的钟走过的时间,而是指CPU工作时间。 
sys : 这个时间代表的是foo运行在核心态的cpu时间

1.根据素数的定义 
即只能被1或者自身整除的自然数(不包括1),称为素数/质数。

#include<iostream> using namespace std;  #define MAX 10000 bool IsPrime(int n) {     if(n == 1)         return false;     for(int i=2; i<n; ++i)     {         if(n%i == 0)             return false;     }     return true; } int main(int argc, char const* argv[]) {     int n = 0;     while(n++ < MAX)     {         if(IsPrime(n))             cout<<n<<'\t';     }     return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

统计耗时 
 
2.利用定理 
如果一个数是素数,那么它的最小质因数肯定<=它的开方.例如,50,最小质因数为2,2<50的开方。 
不是合数,那就是素数。根据上面的定理,一个数只要能被比他的开方<=的所有数整除,那它肯定是合数;反之为素数。这样遍历的数量就会相应减少很多。

#include<iostream> #include<math.h> using namespace std; #define MAX 10000 bool IsPrime(int n) {     int Sqtmp = sqrt(n);     if(n == 1)         return false;     for(int i=2; i<=Sqtmp; ++i)     {         if(n%i == 0)             return false;     }     return true; } int main(int argc, char const* argv[]) {     int n = 0;     while(n++ < MAX)     {         if(IsPrime(n))             cout<<n<<'\t';     }     return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

统计耗时 
 
3.筛法求质数。 
这种方法高效,但内存消耗较大。 

用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。




ת https://blog.csdn.net/derkampf/article/details/62898513

转载请标明出处:判断素数方法总结
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!