hnust 1100 实验3-2:素数判断
题目描述
判断正整数x是否为素数。
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。
输入
先输入一个整数n(表示后面要输入n个测试数据);
然后输入n个测试数据,每个测试数据是一个正整数x。
输出
与n个输入的正整数x相对应,输出判断结果。如果是素数,输出"Yes",不是素数,输出"No"。
样例输入 Copy
5
7
8
795
181
888
样例输出 Copy
Yes
No
No
Yes
No
提示
本题由教材例3-18改编而成。
本题难度系数为4。
解题过程
一个简单的素数检测程序,用于判断用户输入的一系列整数是否为素数。
下面是对代码的详细解析:
-
头文件:
- 包含
<bits/stdc++.h>
头文件,这是一个常用的头文件,包含了标准库中的大部分内容,以及一些竞赛编程中常用的额外头文件。
- 包含
-
命名空间:
- 使用
using namespace std;
来避免在标准库类型和函数前加std::
。
- 使用
-
素数检测函数
prime
:- 接收一个整数
x
作为参数。 - 如果
x
等于1,直接返回false
,因为1不是素数。 - 使用一个
for
循环从2遍历到x/i
,检查x
是否能被其中任何数整除。 - 如果
x
能被整除,返回false
表示x
不是素数。 - 如果循环结束后没有找到整除的数,返回
true
表示x
是素数。
- 接收一个整数
-
主函数
main
:- 首先读取一个整数
j
,表示接下来有多少组测试数据。 - 使用一个
for
循环,从1到j
(包括j
),处理每组测试数据。 - 在每次循环中,读取一个整数
n
,表示要检测的数。 - 调用
prime
函数判断n
是否为素数。 - 根据
prime
函数的返回值,输出 "Yes" 或 "No"。
- 首先读取一个整数
-
程序结束:
- 输入结束后,程序返回0,表示正常结束。
代码逻辑分析:
- 这段代码首先读取测试数据组数,然后对于每组数据,读取一个整数并判断它是否为素数。
- 使用了素数的基本定义来实现判断逻辑,即一个数如果除了1和它本身外没有其他因数,则为素数。
潜在问题:
prime
函数的时间复杂度较高,对于大数的素数检测效率较低。prime
函数没有考虑x
为负数或0的情况,虽然这不是素数检测的常见情况。
改进建议:
- 考虑优化
prime
函数,例如只检查到sqrt(x)
,因为如果x
是合数,它必定有一个不大于sqrt(x)
的因数。 - 可以添加对输入数据有效性的检查,确保读取的是有效的整数。
- 考虑使用更现代的C++特性,如
std::vector
,以提高代码的灵活性和健壮性。
部分代码
代码如下( 素数判断。):
c
bool prime(int x){
if(x==1)return 0;
for(int i=2;i<=x/i;i++)
if(x%i==0)return 0;
return 1;
}
AC代码
c
#include<bits/stdc++.h>
using namespace std;
bool prime(int x){
if(x==1)return 0;
for(int i=2;i<=x/i;i++)
if(x%i==0)return 0;
return 1;
}
int main()
{
int j;cin>>j;int n;
for(int i=1;i<=j;i++)
{
cin>>n;
if(prime(n)){cout<<"Yes"<<endl;}
else cout<<"No"<<endl;
}
return 0;
}