错误解法:
一般可能会这么写
这里的时间复杂度:O($XN$),计算量大概为:$10^9$,大概率会$\color{red}{TLE}$,应考虑对质数判定算法进行优化
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int j=1;j<=n;j++){
int x;
bool is_prime=true;
cin>>x;
if(x==1) cout<<x<<" is not prime"<<endl;
else{
int i;
for(i=2;i<x;i++)
{
if(x%i==0)
{
is_prime=false;
break;
}
else is_prime=true;
}
if(is_prime) cout<<x<<" is prime"<<endl;
else cout<<x<<" is not prime"<<endl;
}
}
return 0;
}
正确解法:试除法判定一个数x是否为质数
时间复杂度:O($\sqrt{X}N$)
计算量大约为:$10^{5.5}$,可以$\color{red}{AC}$
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while (n -- ){
int x;
bool is_prime=true;
cin>>x;
if(x==1) cout<<x<<" is not prime"<<endl;
else{
int i;
for(i=2;i<=x/i;i++)
{
if(x%i==0)
{
is_prime=false;
break;
}
else is_prime=true;
}
if(is_prime) cout<<x<<" is prime"<<endl;
else cout<<x<<" is not prime"<<endl;
}
}
return 0;
}
最后的100个 99999991真的恶心人啊
确实太恶心了
直接把第一个里面for(i=2;i<x;i++)的x换成i<x开方取整+1也行
或者写<=,不写+1
或者写i*i<=x也可以
大佬i*i<=x这个是什么意思啊,萌新看不懂😣
第二个写法里面的i<=x/i,把i挪到等式左边不就变成i×i<=x了。假设x不是质数,则有x=i×j,(假设i<=j,且i≠1),当i<j时i×i<x。在检查所有可能的因子时,随着i增大,j会减小,i取最大值(假设能取到)时i=j,此时i×i=x。
谢谢大佬理解了🙏🌷
最后的100个 99999991真的恶心人啊
你好,想问一下为什么是i<=x/i呢
因为只需要取最小的被除数就可以,只要知道一个约数i,x / i就是另一个约数
就像是2是被除数, 12 / 2 = 6, i就可以等于2
!!!好的!感谢
#include[HTML_REMOVED]
using namespace std;
int main()
{
int n,x;
cin>>n;
system(“pause”):
return 0;
有没有大佬帮忙看下哪出了问题 输入361运行不对
大佬!!!!!
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
void judge(int x)
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
printf(“%d is not prime\n”,x);
return;
}
}
printf(“%d is prime\n”,x);
return;
}
int main()
{
int n;
cin>>n;
for(int i=0;i[HTML_REMOVED]>x;
judge(x);
}
return 0;
}
x本来就并不会是1为什么还判断一下
x可以是1,只不过是不会执行后面的for循环,然后直接判断,最后得出的结果就是1是质数,只是这个题目中并没有1这个例子
#include[HTML_REMOVED]
using namespace std;
int main(){
int n;
cin>>n;
int x;
while(n–){
cin>>x;
int s=0;
if(x==1)cout<<x<<” is not prime”<<endl;
else{
for(int i=2;i<=sqrt(x);i++){
if(x%i==0)s=s+1;
}
if(s!=0)cout<<x<<” is not prime”<<endl;
else cout<<x<<” is prime”<<endl;
}
}
return 0;
}
但是我感觉上下两个实现功能的方法没有什么不同啊,差距竟会如此巨大
请问为什么加这句呢 ?else is_prime=true;
感觉加不加都可以,
#include [HTML_REMOVED]
using namespace std;
int main(){
int n;
cin>>n;
while(n–){
}
可以看看怎么错的吗
把这两句放到for循环外面就可以ac了
if(prime){cout<<x<<” is prime”<<endl;}
else{cout<<x<<” is not prime”<<endl;}
老哥,看题目,给你一个大于1的自然数
这个不影响吧,这个是通解,1并不影响运行效率
必须引入一个新的bool变量吗?
别的也行,作用差不多就是一个哨兵~