我正在为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;
}
答案 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;
}
}
我希望这会对你有所帮助。