素数判断
在这个网站有优化后的高效判断素数的方法:https://www.geeksforgeeks.org/primality-test-set-1-introduction-and-school-method/
下面是我复制过来的,大家可以学一学那个高效的方法,真的厉害。👍
School Method
A simple solution is to iterate through all numbers from 2 to n-1 and for every number check if it divides n. If we find any number that divides, we return false.
Below is the implementation of this method.
// A school method based C++ program to check if a // number is prime #include <bits/stdc++.h> using namespace std; bool isPrime(int n) { // Corner case if (n <= 1) return false; // Check from 2 to n-1 for (int i=2; i<n; i++) if (n%i == 0) return false; return true; } // Driver Program to test above function int main() { isPrime(11)? cout << " true\n": cout << " false\n"; isPrime(15)? cout << " true\n": cout << " false\n"; return 0; }
Optimized School Method
We can do following optimizations:
- Instead of checking till n, we can check till √n because a larger factor of n must be a multiple of smaller factor that has been already checked.
- The algorithm can be improved further by observing that all primes are of the form 6k ± 1, with the exception of 2 and 3. This is because all integers can be expressed as (6k + i) for some integer k and for i = -1, 0, 1, 2, 3, or 4; 2 divides (6k + 0), (6k + 2), (6k + 4); and 3 divides (6k + 3). So a more efficient method is to test if n is divisible by 2 or 3, then to check through all the numbers of form 6k ± 1. (Source: wikipedia)
Below is the implementation of this solution.
// A optimized school method based C++ program to check // if a number is prime #include <bits/stdc++.h> using namespace std; bool isPrime(int n) { // Corner cases if (n <= 1) return false; if (n <= 3) return true; // This is checked so that we can skip // middle five numbers in below loop if (n%2 == 0 || n%3 == 0) return false; for (int i=5; i*i<=n; i=i+6) if (n%i == 0 || n%(i+2) == 0) return false; return true; } // Driver Program to test above function int main() { isPrime(11)? cout << " true\n": cout << " false\n"; isPrime(15)? cout << " true\n": cout << " false\n"; return 0; }