两个给定整数之间的质数

时间:2019-05-16 06:36:33

标签: c++ primes

这是我的代码,用于查找两个整数之间的质数。它可以编译,但在codechef上给出运行时错误SIGXFSZ。

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n,m;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        for(long long j=m;j<=n;j++)
            for(long long i=2;i<=sqrt(j);i++)
                if(j%i==0)
                    break;
                else cout<<j<<"\n";
        cout<<"\n";
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

似乎您在逻辑上是错误的。

根据我的理解,您应该在两个数字之间打印质数。

但是您的代码有逻辑错误。

1)代码未将2和3视为素数。

m = 1n = 10。对于j = 2, 3,即使只有一次也不会执行内部循环。因此,输出不会显示为用户。

2)else cout<<j<<"\n";语句放置不正确,因为它会导致素数被多次打印以及某些复合数。

示例:

对于j = 11,此代码将打印两次11for i = 2, 3)。

对于j = 15,此代码将是15一次(for i = 2),尽管它是一个复合数字。

答案 1 :(得分:0)

您没有解释您的问题,而是为您的代码编写了代码。您的程序需要两个单独的输入:首先,要执行的试验次数;其次是两个数字,表示每次审判的开始和结束。

您的代码逻辑不正确且不完整。如果要始终使用括号,这可能很清楚。最内层的循环需要在非素数上失败,但是只有break发出素数信号失败,因此除非循环完成,否则不可能有一个。您声明素数的位置不正确。要正确处理这种情况,需要某种标记变量或其他修复程序来模拟带标签的循环:

int main() {
    int trials;

    cin >> trials;

    while (trials--)
    {
        long long start, stop;

        cin >> start >> stop;

        for (long long number = start; number <= stop; number++)
        {
            if (number < 2 || (number % 2 == 0 && number != 2))
            {
                continue;
            }

            bool prime = true;

            for (long long odd = 3; odd * odd <= number; odd += 2)
            {
                if (number % odd == 0)
                {
                    prime = false;
                    break;
                }
            }

            if (prime)
            {
                cout << number << "\n";
            }
        }
    }

    return 0;
}

该代码采用一种最简单的方法来处理偶数和偶数,这是一种特殊情况,并着重于循环奇数。

答案 2 :(得分:-1)

这基本上是“超出文件大小”,这意味着输出文件的大小大于允许的大小。

请检查程序的输出文件大小。