本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N
(≤ 10),随后N
行,每行给出一个小于231的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes
,否则输出No
。
输入样例:
2
11
111
输出样例:
Yes
No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
失败案例:显示超时
#include <iostream>
using namespace std;
bool ifprime(int n)
{
if (n==0||n==1) return false;
else{
for(int i=2;i*i<n;i++){
if(n%i==0) return false;
}
}
return true;
}
int main()
{
int num;
cin>>num;
for(int i=0;i<num;i++)
{
int n;
cin>>n;
if (ifprime(n)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
错因:
这道题的取值范围是到 2^31 所以 i*i 有可能会超过 int 的范围,因此提交时会显示运行超时
修改方法一:使用long long 来定义整数i
#include <iostream>
using namespace std;
typedef long long ll;
bool ifprime(int n)
{
if (n==0||n==1) return false;
else{
for(ll i=2;i*i<n;i++){
if(n%i==0) return false;
}
}
return true;
}
int main()
{
int num;
cin>>num;
for(int i=0;i<num;i++)
{
int n;
cin>>n;
if (ifprime(n)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
修改方法二:使用sqrt( )函数
#include <iostream>
#include <cmath>
using namespace std;
bool ifprime(int n)
{
if (n==0||n==1) return false;
else{
for(int i=2;i<sqrt(n);i++){
if(n%i==0) return false;
}
}
return true;
}
int main()
{
int num;
cin>>num;
for(int i=0;i<num;i++)
{
int n;
cin>>n;
if (ifprime(n)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}