保罗鄂尔多斯猜想[Java]

时间:2015-03-17 18:00:47

标签: java algorithm primes number-theory sieve

我一直试图在SPOJ上解决这个相当容易的问题:http://www.spoj.com/problems/HS08PAUL/

它需要素数(小于n),可以用x ^ 2 + y ^ 4(其中x和y是整数)的形式表示。

我已经掀起了一个蛮力解决方案,这个解决方案花了很长时间(n~ = 1000000),导致发动机抛出TLE(超出时间限制)错误。这是源代码:

import java.io.*;
import java.util.*;

class HS08PAUL  {
   public static int[] sieve(int n){

        boolean[] prime = new boolean[n+1];
        int[] primeNumbers = new int[n];
        int index = 0;
        Arrays.fill(primeNumbers, 0);
        Arrays.fill(prime,true);

        prime[0] = false;
        prime[1] = false;
        int m = (int)Math.sqrt(n);
        for(int i = 2; i <= m; i++){
            if(prime[i])
            for(int k = i*i; k<=n; k+=i)
                prime[k] = false;

        }

        for(int j = 2; j <= n; j++) {
            if(prime[j]) {
                primeNumbers[index] = j;
                index++;
            }
        }
        return primeNumbers;
    }

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        try{
            double numberOfTestCases = in.nextDouble();
            while(numberOfTestCases -- > 0) {
                int index = 0, y = 0, count = 0;
                int num = in.nextInt();
                int[] primes = sieve(num);
                while(index < num/3 ) {
                    for(y = 1; y < 57   ; y ++) {
                        if(Math.ceil(Math.sqrt(primes[index] - Math.pow(y,4))) == Math.floor(Math.sqrt(primes[index] - Math.pow(y,4)))) {
                                count++;
                                break;
                        }   

                    }
                    index++;
                }
                System.out.println(count);
            }   
        }
        catch(Exception e) {
        }
    }   
}   

有没有办法让这种方法有效?

P.S.:请忽略不守规矩的异常处理。

1 个答案:

答案 0 :(得分:-1)

x0000 + y ^ 4有多少个数字在1000000以下?有多少素数在1000000以下?这两个数字告诉你应该如何处理解决方案?

@ isnot2bad的评论也是相关的。