问题标题: 酷町堂:1106 素数 超时了!!!

0
0
已解决
刘乐宸
刘乐宸
新手天翼
新手天翼

我的代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    int n,m,f=0,t=0;
    cin>>n>>m;
    for(int i=n;i<=m;i++)
    {
        for(int j=2;j<i;j++)
        {
            if(i%j==0)f=1;
        }
        if(f==0)t++;
        f=0; 
    }
    cout<<t;
    return 0;
}


1
已采纳
栾峻岩
栾峻岩
初级天翼
初级天翼

总体思路是没有问题的。

就是在第二重循环

​
for(int j=2;j<i;j++)

​

可以优化一下,改成:

for (int j=2;j<=sqrt(i);j++)
//sqrt函数需要加上 #include <cmath> 头文件。

证明:因数和倍数(五年级下会学,六年级及以上的同学们应该会吧)。

 

if(i%j==0)f=1;

可以改一下:

if(i%j==0)
{
   f=1;
   break;
}

因为一个数有了一个大于2且不为n的因数,这个数一定不是因数,就不用再往后找了。

算法时间复杂度:O(Msqrt(M)) 不会超时。

0
许天奕
许天奕
新手守护
新手守护

Q1:

if(n==1)n=2;

Q2:

for(int j=2;j<=sqrt(i);j++)

Q3:

if(i%j==0){
   f=1;
   break;
}

改一下就OK啦!!!

求采纳

0
丁浩然
丁浩然
新手光能
新手光能

其实判断素数(质数)时,只需除到sqrt(那个数)即可

0
金一铭
金一铭
新手光能
新手光能

第二层循环要循环到上循环的平方根,而且还要加停止循环,否则会超时。

0
0
0
0
0
傅文彬
傅文彬
新手天翼
新手天翼

第二层循环要循环到上循环的sqrt,而且还要加break,否则会超时。

0
我要回答