[Java] problem z obliczeniem liczby pierwszej

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 :(

1

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)

0

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

1

Hint! Która pętla?

0

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

2

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

0

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

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...

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