Od jakiegoś czasu nie kodowałem w Javie. Znajduję pierwsze 100 liczb pierwszych, które również są palindromem, teraz, gdy uruchamiam następujący kod: public class PalindromPrime { /** * Main: Wyświetla ...

-2
Yunfei Chen 23 czerwiec 2021, 20:21

4 odpowiedzi

Najlepsza odpowiedź

To nie println jest winny. To jest logika twojej metody isPrime.

Liczba nigdy nie zwraca prawdy, dopóki liczba nie wzrośnie i nie zostanie przepełniona liczba całkowita, zawijając się do najbardziej ujemnej liczby, a następnie test w pętli for zawsze kończy się niepowodzeniem, więc funkcja zawsze zwraca prawdę.

4
Alan 23 czerwiec 2021, 17:33

Twoja implementacja metody isPrime jest nieprawidłowa, ponieważ sprawdza tylko, czy liczba jest nieparzysta, czy nie.

Oto działający zmodyfikowany kod dla pierwszych 100 liczb pierwszych:

class PalindromPrime
{
    public static void main (String[] args)
    {
        int num = 0;
        int myNumber = 2;
        int lineCounter = 0;
        while (num < 100)
        {
            if (isPrime(myNumber))
            {
                num++;
                if (lineCounter % 10 == 0)
                    System.out.print("\n");

                System.out.print(myNumber + " , ");
                lineCounter++;
            }
            myNumber++;
        }
    }

    public static boolean isPrime(int myNumber)
    {
        int limit = (int)Math.sqrt(myNumber);
        for(int i = 2; i <= limit; i++)
        {
            if (myNumber % i == 0)
                return false;
        }
        return true;
    }
}

Wyjście :

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 , 101 , 103 , 107 , 109 , 113 , 
127 , 131 , 137 , 139 , 149 , 151 , 157 , 163 , 167 , 173 , 
179 , 181 , 191 , 193 , 197 , 199 , 211 , 223 , 227 , 229 , 
233 , 239 , 241 , 251 , 257 , 263 , 269 , 271 , 277 , 281 , 
283 , 293 , 307 , 311 , 313 , 317 , 331 , 337 , 347 , 349 , 
353 , 359 , 367 , 373 , 379 , 383 , 389 , 397 , 401 , 409 , 
419 , 421 , 431 , 433 , 439 , 443 , 449 , 457 , 461 , 463 , 
467 , 479 , 487 , 491 , 499 , 503 , 509 , 521 , 523 , 541 , 
-1
GURU Shreyansh 23 czerwiec 2021, 17:32

Problem wydaje się tkwić w instrukcji IF w metodzie isPrime.

Obecnie odwołujesz się do i, a nie do samego numeru.

Change to:
    if(**myNumber** % 2 == 0){
                    return false;
                }

Wyjście: 3, 5, 7, 9, ..

3
Jamez 23 czerwiec 2021, 17:29

Należy poprawić metodę isPrime..

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

Teraz wyjaśnienie problemu...

W swoim kodzie, zamiast sprawdzać, czy liczba jest podzielna przez indeks (myNumber % i), przez pomyłkę dzielisz indeks i przez 2 (i % 2 == 0) i sprawdzasz, czy jest to 0. A ponieważ i jest zawsze rozpoczynając liczenie od 0, a warunek for jest zawsze spełniony dla wszystkich liczb dodatnich (i <= myNumber / 2), pętla zawsze zaczyna się i zwraca wartość false, ponieważ warunek (i % 2 == 0) jest zawsze spełniony.

Gdy myNumber w twojej funkcji głównej w końcu przejdzie cykl do Integer.MAX_VALUE, a następnie osiągnie -ve liczb, twój warunek dla pętli i <= myNumber / 2 w końcu nie zostanie spełniony i otrzymujesz prawdziwy zwrot z funkcji.

Stąd zasadniczo drukujesz 100 liczb odliczając wstecz od Integer.MIN_VALUE

Mam nadzieję, że to wyjaśnia. Jestem pewien, że po oczekiwaniu też osiągałeś wyniki..

1
Vedvyas Mohapatra 23 czerwiec 2021, 17:52