Skip to content

Commit 77e0c3d

Browse files
committed
feat: add is prime solutions
1 parent 25704a3 commit 77e0c3d

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

leetcode/math/is_prime

55.3 KB
Binary file not shown.

leetcode/math/is_prime.cpp

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
/*
2+
* @Author: Chacha
3+
* @Date: 2022-03-15 14:19:00
4+
* @Last Modified by: Chacha
5+
* @Last Modified time: 2022-03-15 15:02:31
6+
*/
7+
8+
/**
9+
* 判断一个数是否为质数(素数)。
10+
* 定义:约数只有 1 和本身的整数成为质数,或称素数。
11+
* 注意:最小的质数是2。
12+
*
13+
*/
14+
#include <iostream>
15+
#include <math.h>
16+
#include <ctime>
17+
18+
using namespace std;
19+
20+
class Solution
21+
{
22+
private:
23+
/* data */
24+
public:
25+
bool isPrime1(int num);
26+
27+
bool isPrime2(int num);
28+
29+
bool isPrime3(int num);
30+
};
31+
32+
/**
33+
* 方法一:
34+
* 直观判断法(效率比较低)
35+
* 质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可。
36+
*
37+
* 时间复杂度:O(n);
38+
*
39+
*/
40+
bool Solution::isPrime1(int num)
41+
{
42+
for (int i = 2; i < num; i++)
43+
{
44+
if (num % i == 0)
45+
return 0;
46+
}
47+
return 1;
48+
};
49+
50+
/**
51+
* 方法二:
52+
* 方法一的优化方法。
53+
* 对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),
54+
* 一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
55+
*
56+
* 时间复杂度:O(sqrt(n));
57+
*
58+
*/
59+
bool Solution::isPrime2(int num)
60+
{
61+
int n = sqrt(num);
62+
for (int i = 2; i <= n; i++)
63+
{
64+
if (n % i == 0)
65+
return 0;
66+
}
67+
return 1;
68+
};
69+
70+
/**
71+
* 方法三:
72+
* 质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;
73+
*
74+
* 1. 能被6整除的,肯定不是素数,故6x不是素数
75+
* 2. 能被2或3整除的,肯定不是素数,故6x+2、6x+3、6x+4也肯定不是素数
76+
* 3. 即6x+1、6x+5(等同6x-1)有可能为素数
77+
*
78+
* 步长设为6,每次只判断6前后的两个数即可。
79+
*
80+
*/
81+
bool Solution::isPrime3(int num)
82+
{
83+
// 排除特殊情况
84+
if (num <= 3)
85+
{
86+
return num > 1;
87+
}
88+
89+
// 不在6的两侧,肯定不是质数
90+
if (num % 6 != 1 && num % 6 != 5)
91+
{
92+
return 0;
93+
}
94+
95+
int n = sqrt(num);
96+
for (int i = 5; i <= n; i += 6)
97+
{
98+
if (num % i == 0 || num % (i + 2) == 0)
99+
{
100+
return 0;
101+
}
102+
}
103+
104+
return 1;
105+
};
106+
107+
int main(int argc, char const *argv[])
108+
{
109+
Solution s;
110+
int test_num = 100000;
111+
int t_start, t_stop;
112+
113+
t_start = clock();
114+
115+
for (int i = 2; i <= test_num; i++)
116+
{
117+
s.isPrime1(i);
118+
}
119+
120+
t_stop = clock();
121+
122+
cout << "方法一所需时间(ms):" << t_stop - t_start << endl;
123+
124+
t_start = clock();
125+
126+
for (int i = 2; i <= test_num; i++)
127+
{
128+
s.isPrime2(i);
129+
}
130+
131+
t_stop = clock();
132+
133+
cout << "方法二所需时间(ms):" << t_stop - t_start << endl;
134+
135+
t_start = clock();
136+
137+
for (int i = 2; i <= test_num; i++)
138+
{
139+
s.isPrime3(i);
140+
}
141+
142+
t_stop = clock();
143+
144+
cout << "方法三所需时间(ms):" << t_stop - t_start << endl;
145+
146+
return 0;
147+
}

0 commit comments

Comments
 (0)