我一直试图在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.:请忽略不守规矩的异常处理。
答案 0 :(得分:-1)
x0000 + y ^ 4有多少个数字在1000000以下?有多少素数在1000000以下?这两个数字告诉你应该如何处理解决方案?
@ isnot2bad的评论也是相关的。