Witam.
Mam za zadanie napisać program w Javie, który tworzy sito Eratostenesa dla podanych liczb i wypisuje czy jest pierwsza, czy złożona.
Ewentualnie wyrzuca wyjątek, że nieprawidłowy format itd.
Mam problem z wyjątkiem OutOfMemoryError, ponieważ przy wpisywaniu np. liczby 999999999 działa on prawidłowo, ale przy podaniu argumentu 9999999999 wyskakuje "Brak liczb pierwszych i/lub zlozonych"
Proszę o pomoc i podsunięcie pomysłu co może być nie tak.
Z góry dziękuję.
Klasa SitoEratostenesa
//tworzenie Sita Eratostenesa
class MyException1 extends Exception {};
public class SitoEratostenesa {
private static int n;
private static boolean[] tab;
SitoEratostenesa(int n) {
this.n = n;
tab = new boolean[n + 1];
for (int i = 2; i * i <= n; i++) {
if (tab[i] == true)
continue;
for (int j = 2 * i; j <= n; j += i)
tab[j] = true;
}
}
// metoda sprawdzająca czy liczbą jest pierwsza
// na utworzonym sicie
public static boolean prime(int m) throws MyException1 {
if (m > n)
throw new MyException1();
if (m < 2)
throw new MyException1();
return (!tab[m]);
}
}
Klasa SitoEratostenesaTest
class MyException2 extends Exception {
};
public class SitoEratostenesaTest {
public static void main(String[] args) {
int maxArg;
try {
maxArg = SitoEratostenesaTest.maksimum(args);
} catch (MyException2 ex) {
//if (args.length == 0)
System.out.println("Brak liczb pierwszych/ zlozonych");
return;
}
try {
SitoEratostenesa Sito = new SitoEratostenesa(maxArg);
for (int i = 0; i < args.length; i++) {
try {
Integer.parseInt(args[i]);
} catch (NumberFormatException err) {
System.out.println("\"" + args[i] + "\" nieprawidlowy argument.");
continue;
}
try {
if (Sito.prime(Integer.parseInt(args[i])))
System.out.println(args[i] + " jest liczba pierwsza.");
else
System.out.println(args[i] + " nie jest liczba pierwsza.");
} catch (MyException1 e) {
System.out.println(args[i] + " to liczba ponizej zakresu (ponizej 2).");
continue;
}
}
} catch (OutOfMemoryError err) {
System.out.println("Proba utworzenia za duzego sita!");
return;
}
}
public static int maksimum(String args[]) throws MyException2 {
int max = 0;
int h = 0;
for (int i = 0; i < args.length; i++) {
try {
h = Integer.parseInt(args[i]);
} catch (NumberFormatException ex) {
continue;
}
if (h > max)
max = h;
}
if (max < 2)
throw new MyException2();
return max;
}
}
Treść zadania: http://mgc.im.pwr.wroc.pl/dyd/kp2013/lista02.pdf
Shalom