[Java] problem z obliczeniem liczby pierwszej

Odpowiedz Nowy wątek
2017-01-25 13:15
0

Witam,

od niedawna uczę się programować w Javie. Obecnie rozwiązuję jeden z problemów w projekcie Euler. Trzeba napisać program, który najpierw sprawdzi przez jakie liczby dzieli się bez reszty jakaś duża liczba (przykładowo 13195), a następnie wyświetli tylko te dzielniki, które są liczbami pierwszymi. Na koniec trzeba jeszcze wyświetlić największy z nich, ale z tym już sobie poradzę. Utknąłem jednak wcześniej - przy wyznaczaniu liczby pierwszej. Wklejam swój kod programu:

 import java.util.*;

public class NajwCzynnik {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

     List<Integer> tablica = new ArrayList<Integer>();
    // Iterator<Integer> itr = tablica.iterator();
     int x = 13195;
     int y=1;
    // int k=2;
     while (y<x) {
         y=y+1;
         if (x%y==0) {
             tablica.add(y);
         }   
     }
     int n = tablica.size();
     System.out.println(tablica);
     System.out.println("Dlugosc tablicy to: "+n);
    // Tutaj zaczynam sprawdzać, czy kolejna liczba z tablicy jest liczbą pierwszą
     Iterator<Integer> itr = tablica.iterator();
     while (itr.hasNext()) { 
         y=1;
         Integer number = itr.next(); 

     if (number % 5 == 0) { 
             itr.remove(); 
             } 
         }

     System.out.print(tablica);

    }

}

W obecnym kodzie na koniec sprawdzam i odrzucam wszystkie liczby podzielne przez 5. Program w takiej formie DZIAŁA, ale jak wiadomo liczba pierwsza ma inne właściwości, niż dzielenie przez 5 :) Muszę podzielić ją przez wszystkie liczby mniejsze od jej wartości. Na logikę próbuję użyć tam pętli for, ale trzy dni starań i zero rezultatu :

 // Tutaj zaczynam sprawdzać, czy kolejna liczba z tablicy jest liczbą pierwszą
     Iterator<Integer> itr = tablica.iterator();
     while (itr.hasNext()) { 
         y=1;
         Integer number = itr.next(); 
         for (int i=2;i==number;i++) {
             if (number % i == 0) { 
                 itr.remove(); 
                 } 
         }

         }

Pętla w takiej formie w ogóle nie działa. Program w ogóle nie wykonuje tej pętli. Co robię nie tak? Nakierujcie mnie i proszę, nie wrzucajcie gotowej odpowiedzi, chcę to zrobić sam, ale utknąłem :(

Czyżby Wydział Podstawowych Problemów Techniki? - barslo 2017-01-25 17:28

Pozostało 580 znaków

2017-01-25 13:30
0

Pomijając że po itr.remove() warto by dać break;!
To masz chyba dobrze - po prostu pechowo wybrałeś liczbę : 13195 (zrób dla innej i zobaczysz)


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
faktycznie to nie to był problem liczba była OK - jarekr000000 2017-01-25 13:53

Pozostało 580 znaków

2017-01-25 13:33
0

Jak dam break, to pętla przestaje działać na pierwszej liczbie podzielnej przez 5, przez co daje zły wynik

Pozostało 580 znaków

2017-01-25 13:38
0

Hint! Która pętla?


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2017-01-25 13:41
0

do tej pętli for program w ogóle mi nie wchodzi...

Pozostało 580 znaków

2017-01-25 13:52

No tak widze - zmień na takie cos:
for (int i=2;i<number;i++) {

UPDATE
I oczywiście możesz ten warunek poprawić (i<numer) sprawdza dużo więcej liczb niż trzeba


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2017-01-25 13:58

Pozostało 580 znaków

2017-01-25 14:11
0

Działa. Jejku, taka pierdoła i trzy dni przekleństw :D Dzięki!

Pozostało 580 znaków

2017-01-25 14:22
2

Pro Tip: jeśli dopiero uczysz się języka, nie chce Ci się ściągać całego IDE, nie chce Ci się uczyć debugera, bo za 2 tyg. egzamin i koniec przygody to używaj "dupa debuging". Na czym to polega:

Zamiast:

     while (y<x) {
         y=y+1;
         if (x%y==0) {
             tablica.add(y);
         }   
     }

Robisz:

     System.out.println("jestem przed petla");
     while (y<x) {
         System.out.println("petla, y = "+y);
         y=y+1;
         if (x%y==0) {
             System.out.println("dodaje do tablicy y = "+y);
             tablica.add(y);
         }   
     }
     System.out.println("jestem za petla");

Nazwa techniki pochodzi od słowa, które warto postawić na początku komunikatu, żeby było łatwo wyciąć przed oddaniem. Można też zastosować "debug" ale to takie niepolskie...


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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