Rozkład liczby na czynniki pierwsze

0

Mam do napisania program, który za pomocą zmodyfikowanego sita Eratostenesa rozkłada liczbę z przedziału [2...n] na czynniki pierwsze. I mam problem z konstruktorem. "Konstruktor tworzy sito Eratostenesa dla liczb od 2 do n, modyfikując je w ten sposób, ze dla każdej liczby pamięta ono jej najmniejszy dzielnik pierwszy." Wiem jak wygląda sito ale nie mam pomysłu jak je przerobić. Mógłbyś ktoś pomóc?

1

Ja bym stworzył klasę A o dwóch polach:

 
boolean notPrime;
int divisor;

Sitem byłaby tablica

A[] sito = new A[zakres];

W standardowym algorytmie tworzenia sita, w momencie zaznaczania, że liczba nie jest pierwsza wiadomo jaki jest jej najmniejszy dzielnik.

0

Treść zadania mam taką: Stwórz klasę RozkladLiczby posiadającą konstruktor RozkladLiczby(int n). Konstruktor tworzy sito Eratostenesa dla liczb od 2 do n, modyfikując je w ten sposób, że dla każdej liczby pamięta ono jej najmniejszy dzielnik pierwszy. Następnie stwórz publiczną metodę int[] czynnikiPierwsze(int m), która dla dowolnej liczby m z przedziału [2; n] zwróci tablicę jej rozkładu na czynniki pierwsze. Rozmiar tablicy powinien być równy ilości tych czynników. Do znajdowania tego rozkładu wykorzystaj wcześniej stworzone, zmodyfikowane sito Eratostenesa. Dodaj odpowiednie własne wyjątki dla powyższej klasy. Znajdź nazwę wyjątku przekroczenia pamięci podczas tworzenia nowego obiektu i zadbaj aby twój program go obsługiwał (przypadek próby stworzenia za dużego sita). Stwórz klasę RozkladLiczbyTest, która w metodzie main stworzy dla odpowiednio dużego n obiekt klasy RozkladLiczby (przetestuj jak duże może być n ), a następnie dla liczb podanych jako argumenty wywołania programu wypisze ich rozkład korzystając z metody czynnikiPierwsze, tworząc tylko jeden obiekt typu RozkladLiczby dla największej liczby wśród argumentów, np 123456 = 2^63643;

Mam coś takiego ale nie chce mi działać:

klasa RozkładLiczby:

class Ex1 extends Exception { };
class Ex2 extends Exception { };
 

class RozkladLiczby {
	int tab[];
	public int tabs[];
	public int prime(int o){
		int i;
		int d=0;
		double sq=Math.sqrt(o);
		while(d!=1){ 
		d=0;
		for(i=1; i<=sq; i++) {
			if(o%i==0) 
			d=d+1;
		}
	   }
    return o;
}
	RozkladLiczby(int n) throws Ex1 {
		int tab[]=new int[n+1];
		if (n<0) throw new Ex1();
		int a,i;
		tab[0]=0;
		tab[1]=1;
		for(i=2; i<n;i++){
		a=2;
		tab[i]=a;
                while((i%a)!=0){
                a=prime(a+1);
		tab[i]=a;
		}
		}
	}	
	public int [] czynnikiPierwsze (int m) throws Ex2 {
		if (m<0) throw new Ex2();
		int e=0;
		int a=0;
		while (m>1) {
			m=m/tab[m];
 			e=e+1;
		}
		int [] tabs=new int[e+1];
		
		while (m>1) {
			tabs[a]=tab[m];
			m=m/tab[m];
			a++;
		}
		return tabs;
	}
}


klasa RozkladLiczbyTest:

class RozkladLiczbyTest {
	public static void main(String args[]) { 
	int n,m,c[];
	int k=args.length;
	int []t= new int[k];
	for(int i=0; i<k; i++) { 
	try {
		t[i]=Integer.parseInt(args[i]);
	}
	catch (NumberFormatException ex) {
		System.out.println(args[i]+ " Bledne dane wejsciowe"); 
		continue;
	}
	}
	n = t[0];
	for(int i=0; i<k;i++){
		if(t[i]>n)
		n=t[i];
	}
	RozkladLiczby b;
	try {
	b=new RozkladLiczby(n);
	}
	catch (Ex1 z) {
 	System.out.println(n+ " Liczba nie moze byc < 0");
	return;
	}
	for(int i=0;i<k;i++) {
	try {
			 c=b.czynnikiPierwsze(t[i]);
	}
	catch(Ex2 x) {
    	System.out.println(t[i]+ " Brak elementu o tym indeksie");
    	continue;
	}
	System.out.println(t[i]+"="+c);
	}  
}
}
0

Jeśli chcesz dokładnej analizy swojego kodu, to go sformatuj i sensownie ponazywaj zmienne.
Jaki jest sens tej funkcji?

    public int prime(int o){
        int i;
        int d=0;
        double sq=Math.sqrt(o);
        while(d!=1){ 
        d=0;
        for(i=1; i<=sq; i++) {
            if(o%i==0) 
            d=d+1;
        }
       }
    return o;
}

Równoważna (krótsza i czytelniejsza) postać:

public int prime(int o)
{
    return o;
}
0

już sobie poradziłem z tym i mam c prawie cały program, uległ on modyfikacji i działa :D teraz tylko brakuje mi wyjątku o przekroczeniu pamięci i zapisanie tych potęg. Z potęgami walczę i prawie się udało tylko nie tak jak chcę ale popróbuję jeszcze. A ten wyjątek to OutOfMemoryError czy coś innego? i jak to wpisać żeby działało?

i tej funkcji prime tam nie mam już

0

Nie sprawdzasz żadnych wyjątków bo OutOfMemoryError, to jak nazwa wskazuje błąd. Jego się z zasady nie łapie.
Jeżeli chcesz sprawdzić czy nadal możesz liczyć na pamięć, to użyj do tego metod Javy zwracających ilość wolnej pamięci. Na przykład coś podobnego:

final Runtime rtm = Runtime.getRuntime();
final long maxMem = rtm.rtm.maxMemory() ;
boolean endOfCalc;
do{
	final long freeMem = maxMem - rtm.totalMemory() + rtm.freeMemory();
	endOfCalc = (double)freeMem / maxMem < 0.20; //mniej niż 20% wolnej pamięci
	//obliczenia
	//...
}
while(!endOfCalc);

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