一、题目再现
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N
(≤ 10),随后N
行,每行给出一个小于2^31的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes
,否则输出No
。
输入样例:
2
11
111
输出样例:
Yes
No
二、思路
本题的难点在于素数的定义以及判断素数的函数的编写;还有一个运行超时问题。
三、知识点
素数的定义
质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是质数,则称之为合数(也称为合成数)。
sqrt函数
C ++中的sqrt()函数返回数字的平方根。
√x = sqrt(x)
此函数在<cmath>头文件中定义。
四、问题
超时问题://用i*i<=n 就会超时;用i <= sqrt(n)就可以
在一般情况下,乘法运算通常比sqrt
(开方运算)要快。乘法运算是计算机硬件中的基本运算之一,通常在硬件级别进行高度优化,因此速度较快。sqrt
运算涉及更复杂的数学操作,可能需要更多的计算资源,因此相对较慢。
但是,在本题中需要判断的数据为小于2^31,也就是说可能数据会很大,那么sqrt函数的运行时间可能要比乘法的少【个人理解】
五、AC代码
#include <iostream>
#include <cmath>
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;
}
欢迎评论区交流~