本题的目标很简单,就是判断一个给定的正整数是否素数。
输入在第一行给出一个正整数N
(≤ 10),随后N
行,每行给出一个小于2^31的需要判断的正整数。
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes
,否则输出No
。
- 2
- 11
- 111
- Yes
- No
本题的难点在于素数的定义以及判断素数的函数的编写;还有一个运行超时问题。
质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是质数,则称之为合数(也称为合成数)。
C ++中的sqrt()函数返回数字的平方根。
√x = sqrt(x)
超时问题://用i*i<=n 就会超时;用i <= sqrt(n)就可以
在一般情况下,乘法运算通常比sqrt
(开方运算)要快。乘法运算是计算机硬件中的基本运算之一,通常在硬件级别进行高度优化,因此速度较快。sqrt
运算涉及更复杂的数学操作,可能需要更多的计算资源,因此相对较慢。
但是,在本题中需要判断的数据为小于2^31,也就是说可能数据会很大,那么sqrt函数的运行时间可能要比乘法的少【个人理解】
- #include
- #include
- using namespace std;
-
- bool isPrime(int n) {
- /*质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数
- (也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是质数,则称之为合数(也称为合成数)。*/
-
- //一个数如果能被 除了1和该数自身外 的自然数 整除,那么return false ;否则return true
-
- if (n <= 1) {
- return false; // 1和负数都不是素数
- }
-
- if (n <= 3) {
- return true; // 2和3是素数
- }
-
- // 检查是否可以被2或3整除
- if (n % 2 == 0 || n % 3 == 0) {
- return false;
- }
-
- // 检查是否可以被6k ± 1的形式整除,其中k是正整数
- //例如 6k ± 1在1~10中为5,7 其他的数字上面已经判断了。
- //比如1是第一if语句
- //2的倍数 2、4、6能被2整除(第三个if语句)
- //3的倍数 3、6、9能被3整除(第三个if语句)
- for (int i = 5; i <= sqrt(n); i += 6) {//用i*i<=n 就会超时
- if (n % i == 0 || n % (i + 2) == 0) {
- return false;
- }
- }
-
- return true;
- }
-
- int main() {
- int n;
- cin >> n;
- int m[10];
- for (int i = 0; i < n;i++)
- {
- cin >> m[i];
- if (isPrime(m[i]))
- {
- cout << "Yes" << endl;
- }
- else
- {
- cout << "No" << endl;
- }
- }
- return 0;
- }
其他判断一个数是否为素数的函数(我还没太理解)
- bool isPrime(int n) //判断素数
- {
- if(n <= 1)
- {
- return false;
- }
- for(int i = 2; i <= sqrt(n); i++)
- {
- if(n%i == 0)
- {
- return false;
- }
- }
- return true;
- }
欢迎评论区交流~