Zadanie Liczby Pierwsze na SPOJ-u – sędzia twierdzi, że rozwiązanie jest nieprawidłowe

0

Elo :0. Mam problem z zadaniem http://pl.spoj.com/problems/PRIME_T/ sędzia piszę że błędna odpowiedz a u mnie w ide wszystko działa. Możecie mnie naprowadzić jak to dobrze zrobić o to mój kod:

import java.util.Scanner;

public class main {
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            boolean isprime=true;
            int i=scanner.nextInt();

            if(i==1) {
                isprime = false;
            }else
            {
                for (int j = 2; j * j <= i; j++) {
                    if (i % j == 0) {
                        isprime = false;
                        break;
                    }
                }
            }
            if(isprime) System.out.println("TAK");
            else System.out.println("NIE");
        }


}
0

Ilość testów?

0

ale na wejściu dostajesz np.

3
11
1
4

gdzie 3 to ilość testów, a 11, 1 i 4 to są właśnie testy (wartości które masz sprawdzić)

a nie jednego inta, więc musisz zrobić na ten swój kod pętle która sprawdza te wszystkie testy

nie znam javy, ani jakichś hardkorowych optymalizacji, ale pewnie chcesz zrobić coś typu

int amountOfTests = scanner.nextInt();

while (amountOfTests > 0)
{
   // logika algorytmu np.
   // pobranie wartości do testu np. int 11
   // sprawdzenie czy 11 jest prime
   // wyświetlenie tak/nie

   amountOfTests--;
}
0

Jak się jeszcze raz nad tym Zastanowisz, to Napiszesz poprawnie, a jak nie to tu jest kod który działa (funkcja testująca jest toporna - tylko dla przykładu, może nie spełniać wymogów czasu):

import java.util.Scanner;

public class Primes {

    public static boolean isPrime(int n){
        if (n % 2 == 0 || n == 1) return false;
        for (int k = 3; k <= Math.sqrt(n); k += 2) {
            if (n % k == 0) return false;
        }
        return true;
    }

    public static void main(String [] args) {
        Scanner scanner  = new Scanner(System.in);
        int i = scanner.nextInt();
        for (int k = 0; k < i; k++) {
            int s = scanner.nextInt();
            if (isPrime(s))
                System.out.println("TAK");
            else
                System.out.println("NIE");
        }

    }
}
0

Twoja funkcja nie uwzględnia 2 i spoj tego nie zalicza lecz pokombinowałem i zrobiłem to tak

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

Spoj teraz to zalicza. Można to jakoś ulepszyć żęby był mniejszy czas kompilacjii ?

0

Można zrobić to dużo wydajniej, patrz Sito Eratostenesa. Ten kod w pythonie przeszedł mi w 0.11s

import math
import sys

pierw = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]


def czypierw(liczba):
	if liczba < 2:
		return "NIE\n"
	pierwiast = math.sqrt(liczba)
	for dzielnik in pierw:
		if dzielnik > pierwiast:
			return "TAK\n"
		if liczba % dzielnik == 0:
			return "NIE\n"
	return "TAK\n"


ileliczb = int(sys.stdin.readline())
for test in range(ileliczb):
	liczba = int(sys.stdin.readline())
	sys.stdout.write(czypierw(liczba))

1 użytkowników online, w tym zalogowanych: 0, gości: 1