public class SitoEratostenesa {
private boolean tab[];
public SitoEratostenesa(int n)
{
int end;
boolean[] tab = new boolean[n];
end = (int) Math.floor(Math.sqrt(n));
for (int i=2;i<end;i++ )
{
tab[i]=true;
}
for (int i=2;i<=Math.sqrt(end);i++) {
if (tab[i]==true) {
for(int j=i;j<end;j++) {
int number=j;
if (number % i == 0 && number != i) {
tab[j]=false;
}
}
}
}
}
public boolean prime(int m)
{
if(tab[m]) return true;
else return false;
}
}
Póki nie poprawisz formatowania, nikt Ci nie pomoże...
a jak to zrobić? Sorka ale jestem tutaj 2 dzień i nie kumam zbytnio a mam problem bo zadanie na jutro :(
Formatowanie kodu to między innymi odpowiednie wstawianie spacji.
Porównaj te dwa kody:
if(xyz)a=foo()*2; else
a=lol();
if (xyz)
{
a = 2*foo();
} else
{
a = lol();
}
Który jest według Ciebie czytelniejszy?
Do poprawy jest ten fragment:
for (int i=2;i<=Math.sqrt(end);i++) {
if (tab[i]==true) {
for(int j=i;j<end;j++) {
int number=j;
if (number % i == 0 && number != i) {
tab[j]=false;
}
}
}
Nie widać, gdzie kończy się jeden blok, a zaczyna drugi.
Chodzi po prostu o to, aby nie było to zbite w jedną całość.
public class SitoEratostenesa {
private boolean tab[];
public SitoEratostenesa(int n)
{
int end;
boolean[] tab = new boolean[n];
end = (int) Math.floor(Math.sqrt(n));
for (int i=2;i<end;i++ )
{
tab[i]=true;
}
for (int i=2;i<=Math.sqrt(end);i++)
{
if (tab[i]==true)
{
for(int j=i;j<end;j++)
{
int number=j;
if (number % i == 0 && number != i)
{
tab[j]=false;
}
}
}
}
}
public boolean prime(int m)
{
if(tab[m]) return true;
else return false;
}
}
Jest chociaż odrobinę lepiej?
Raczej:
for (int i=2;i<=Math.sqrt(end);i++)
{
if (tab[i]) // porównywanie `==true` jest zbędne
{
for(int j=i;j<end;j++)
{
int number=j;
if (number % i == 0 && number != i)
tab[j]=false;
}
}
}
a w dalszej części jest okej?
I zrobilem do nigo jeszcze taki plik bo bylo tak w zadaniu i wyskakuje mi błąd i nie wiem jak go poprawić
Exception in thread "main" java.lang.NullpointerExceprion
at SitoErastotenesa.prime ( nr 29 linijki)
at SitoErastotenesaTest.prime (nr 29 linijki)
Zarówno w klasie jak i w funkcji deklarujesz boolean[] tab;
- powinieneś tylko jako pole klasy.
Czyli w tym pierwszym pliku usunąć
boolean[] tab = new boolean[n];
tak?
Nie do końca usunąć - usuń samą deklarację zmiennej, ponieważ rozmiar tablicy musisz siłą rzeczy ustawić.
Niestety nie pomaga :(
co to znaczy "nie pomaga"? gdzie i jaki masz błąd?
tu masz kod działający mniej-więcej tak, jak wydawało mi się, że Twój powinien działać - tylko w C#
class SitoEratostenesa
{
private bool[] primes;
private bool IsPrime(int n)
{
for (int i = 0; i < n; i++)
{
if (primes[i] && n % i == 0)
return false;
}
return true;
}
public SitoEratostenesa(int n)
{
int end = (int)Math.Floor(Math.Sqrt(n));
primes = new bool[end];
for (int i = 2; i < end; i++)
primes[i] = true;
for (int i = 2; i < end; i++)
primes[i] = IsPrime(i);
}
public static bool prime(int m)
{
return m < primes.Length && primes[m];
}
}