是数字素数 - SPOJ - 错误"运行时错误(NZEC)"

时间:2016-07-15 13:36:08

标签: java

我正在为SPOJ.com做一个应该识别Prime号码的程序。不幸的是,这个SPOJ taks是波兰语,因此我将尝试翻译输入和输出预期:

输入: n - 测试次数n <100000,在下一行中n个区间为[1..10000]

输出: 对于单词&#34; YES&#34;的每个数字,如果该数字是素数。 Word:&#34; NO&#34;,否则。

示例:

Input:
3
11
1
4

Output:
YES
YES
NO

我在测试过程中编写了以下代码,完美无缺。不幸的是,当我试图在SPOJ网页上提交此代码时,它会不断回复我的错误&#34; 运行时错误(NZEC)&#34;有人可以建议我如何改进它吗?

    Scanner in = new Scanner(System.in);
    int n = in.nextInt();

    if(1<=n&& n<=100000){
        for(int i = 0; i<n+1; i++){
            int v = in.nextInt();
            if(1<=v&&v<=10000){
                if(isPrime(v) == true){
                    System.out.println("YES");
                }
                if(isPrime(v) == false){
                    System.out.println("NO");
                }
            }
        }
    }
}
private static boolean isPrime(int v) {
    if (v < 2) return true;
    if (v == 2) return true;
    if (v % 2 == 0) return false;
    for (int i = 3; i * i <= v; i += 2)
        if (v % i == 0) return false;
    return true;

}

2 个答案:

答案 0 :(得分:1)

您是否了解过素数的筛选方法。
  Check here你会找到更好的解决方案。

public class PrimeSieve {
    public static void main(String[] args) { 
        int n = Integer.parseInt(args[0]);

        // initially assume all integers are prime
        boolean[] isPrime = new boolean[n+1];
        for (int i = 2; i <= n; i++) {
            isPrime[i] = true;
        }

        // mark non-primes <= n using Sieve of Eratosthenes
        for (int factor = 2; factor*factor <= n; factor++) {

            // if factor is prime, then mark multiples of factor as nonprime
            // suffices to consider mutiples factor, factor+1, ...,  n/factor
            if (isPrime[factor]) {
                for (int j = factor; factor*j <= n; j++) {
                    isPrime[factor*j] = false;
                }
            }
        }

        // count primes
        int primes = 0;
        for (int i = 2; i <= n; i++) {
            if (isPrime[n]) primes++;
        }
        System.out.println("The number of primes <= " + n + " is " + primes);
    }
}

答案 1 :(得分:0)

您应该检查从2到n的所有数字,以查看该数字是否为罚款。

<强>代码

public class Test {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        for(int i = 0; i < n ; i++) {
            int v = in.nextInt();
            if (v >= 1 && v < 10000) {
                if (isPrime(v) == true) {
                    System.out.println("YES");
                }
                if (isPrime(v) == false) {
                    System.out.println("NO");
                }
            }
        }
    }

    private static boolean isPrime(int v) {
        for(int i=2;i<v;i++) {
            if(v%i==0)
                return false;
        }
        return true;
    }
}

我希望这会对你有所帮助。