Zadanie Sito Erastotenesa do sprawdzenia

0
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;
 
    }
 
}
0

Póki nie poprawisz formatowania, nikt Ci nie pomoże...

0

a jak to zrobić? Sorka ale jestem tutaj 2 dzień i nie kumam zbytnio a mam problem bo zadanie na jutro :(

0

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

0
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?

0

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;
    }
  }
}
0

a w dalszej części jest okej?

0

I zrobilem do nigo jeszcze taki plik bo bylo tak w zadaniu i wyskakuje mi błąd i nie wiem jak go poprawić

0

Exception in thread "main" java.lang.NullpointerExceprion
at SitoErastotenesa.prime ( nr 29 linijki)
at SitoErastotenesaTest.prime (nr 29 linijki)

0

Zarówno w klasie jak i w funkcji deklarujesz boolean[] tab; - powinieneś tylko jako pole klasy.

0

Czyli w tym pierwszym pliku usunąć

boolean[] tab = new boolean[n];

tak?

0

Nie do końca usunąć - usuń samą deklarację zmiennej, ponieważ rozmiar tablicy musisz siłą rzeczy ustawić.

0

Niestety nie pomaga :(

0

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];
	}
}

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