SPOJ Liczby pierwsze błąd w kodzie

0

Mam problem z zadaniem "Liczby Pierwsze" w SPOJu, otóż próbuję wszelkich sposobów i mi nie wychodzi, może problem leży w złym zrozumieniu zadania?

using System;

public class Test
{
public static void Main()
{
for (int i = 1; i <= 10000; i++)
{
if (i == 1)
Console.WriteLine("NIE");
else if (i == 2 || i == 3 || i == 5 || i == 7)
Console.WriteLine("TAK");
else if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0 || i % 7 == 0)
Console.WriteLine("NIE");
else
Console.WriteLine("TAK");
}
}
}


Wypisując widzę że np liczba 121 jest zapisana jako liczba pierwsza a takową nie jest, ale dodając kod:
<code class="c#">
else if (i == 2 || i == 3 || i == 5 || i == 7 >>>>>>|| i == 11)<<<<<<
                Console.WriteLine("TAK");
else if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0 || i % 7 == 0 >>>>>>|| i % 11 == 0)<<<<<<<

Nadal mam Błędną odpowiedź. Może ktoś mnie nakierować?

0

Zdajesz sobie sprawę, że musisz wczytać dane, które mogą wyglądać np tak:

Input:
3
11
1
4

ale równie dobrze inaczej? Nigdzie nie jest powiedziane, że masz wypisać informacje dla 10000 pierwszych liczb.

0

tzn. że mam stworzyć int który będzie przyjmował liczbę liczb które mają zostać sprawdzone czy są liczbami pierwszymi tak? Zrobiłem coś takiego i nadal błędna odpowiedź :/

int x;
x = Int32.Parse(Console.ReadLine());
if (x <= 100000)

        for (int i = 1; i <= x; i++)
        {
              if (i == 1)
                  Console.WriteLine("NIE");
              else if (i == 2 || i == 3 || i == 5 || i == 7 || i == 11)
                  Console.WriteLine("TAK");
               else if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0 || i % 7 == 0 || i % 11 == 0)
                        Console.WriteLine("NIE");
              else
                  Console.WriteLine("TAK");
         }

---------------------------------------------
Coś mi się wydaje że po prostu nie rozumiem polecenie

Może ktoś wytłumaczyć dokładniej

Input
n - liczba testów n<100000, w kolejnych liniach n liczb z przedziału [1..10000]

-----------------------------------------------------------------------------------------------------------------------------------------------------

Kolejna wersja też błędna ktoś ma jakieś sugestie?
<code class="c#">
int x;
        int n;
        x = Int32.Parse(Console.ReadLine());
        if (x <= 100000)

            for (int i = 1; i <= x; i++)
            {
                n = Int32.Parse(Console.ReadLine());
                if (n > 0 && n < 10000)
                {
                    if (n == 1)
                        Console.WriteLine("NIE");
                    else if (n == 2 || n == 3 || n == 5 || n == 7 || n == 11)
                        Console.WriteLine("TAK");
                    else if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0 || n % 11 == 0)
                        Console.WriteLine("NIE");
                    else
                        Console.WriteLine("TAK");
                }
             }  
0

Pierwsza liczba to liczba testów. Następnie musisz sprawdzić, czy liczba jest pierwsza dla n liczb.
Liczba może być z przedziału od 1 do 10000.

Poczytaj sobie o sicie Eratostenesa.

0

Ok teraz już wydaje mi się że wszystko zrozumiałem i wygląda na to że aplikacja działa dobrze z jednym wyjątkiem, teraz wywala mi błąd przy kompilacji:
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
błąd wyskakuje dla liczb 1-10 lecz pierwsza liczba wpisana z tego przedziału wyświetli się TAK lub NIE
Nie wiem co mogę robić źle, ktoś coś widzi?

using System;

public class Test
{
public static void Main()
{
int x;
int n;

    x = Int32.Parse(Console.ReadLine()); //podaje liczbę testów

    for (int i = 1; i <= x; i++) //wykonuje liczbę testów
    {
        n = Int32.Parse(Console.ReadLine()); //podaje liczbę do sprawdzenia
        {
            if (n == 1)
            {
                Console.WriteLine("NIE");
            }
            else if (n == 2 || n == 3 || n == 5 || n == 7 || n == 11 || n == 13)
            {
                Console.WriteLine("TAK");
            }
            else if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0 || n % 11 == 0 || n % 13 == 0)
            {
                Console.WriteLine("NIE");
            }
            else
            {
                Console.WriteLine("TAK");
            }
        }
        Console.Read();
    }
}

}

0

Console.Read() na końcu pętli jest niepotrzebny. Ale i tak Twój algorytm jest wciąż niepoprawny.

0

Szukając odpowiedzi na pytanie jak zrobić ten program trafiłem na kawałek kodu który wypisuje liczby pierwsze jednak nie do końca rozumiem jak on działa ktoś mógłby mi wytłumaczyć? chciałbym zrozumieć jak to działa by zrobić swoją wersję program który podaję nie jest gotowcem do programu, a tylko programem o tej samej tematyce

using System;

namespace se_cs
{
/// <summary>
/// Sito Eratostenesa - poszukiwanie liczb pierwszych
/// </summary>
class Sito_Eratostenesa
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
int i, j, zakres, dokad;
int[] tablica = new int[10000];

        Console.WriteLine("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze");
        zakres = int.Parse(Console.ReadLine());
        dokad = (int)Math.Floor(Math.Sqrt(zakres));

        //inicjuj tablice
        for (i = 1; i <= zakres; i++) tablica[i] = i;

        //algorytm - sito eratostenesa
        for (i = 2; i <= dokad; i++)
        {
            if (tablica[i] != 0)
            {
                j = i + i;
                while (j <= zakres)
                {
                    tablica[j] = 0;
                    j += i;
                }
            }
        }

        //wypisz wynik
        Console.WriteLine("Liczby pierwsze z zakresu od 1 do " + zakres);
        for (i = 2; i <= zakres; i++)
            if (tablica[i] != 0)
            {
                Console.WriteLine("TAK");
            }
            else
            {
                Console.WriteLine("NIE");
            }

        Console.Read();
    }
}

}


Link do Strony o Sito Eratostenesa z tłumaczeniem http://www.algorytm.org/algorytmy-arytmetyczne/sito-eratostenesa.html
Link do programu http://www.algorytm.org/algorytmy-arytmetyczne/sito-eratostenesa/se-cs.html
0

Wiem na jakiej zasadzie napisać kod aby uzyskać wzór sita Erastotenesa jednak nie potrafię tego potem wypisać

Posiadając taki fragment kodu w jaki sposób wypisać odpowiedź?

int i, j, zakres, dokad;
int[] tablica = new int[10000];

        Console.WriteLine("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze");
        zakres = int.Parse(Console.ReadLine());
        dokad = (int)Math.Floor(Math.Sqrt(zakres));

        //inicjuj tablice
        for (i = 1; i <= zakres; i++) tablica[i] = i;

        //algorytm - sito eratostenesa
        for (i = 2; i <= dokad; i++)
        {
            if (tablica[i] != 0)
            {
                j = i + i;
                while (j <= zakres)
                {
                    tablica[j] = 0;
                    j += i;
                }
            }
        }
0

Przeiteruj po tablicy i zapisz niezerowe elementy, to będą Twoje liczby pierwsze. Potem tylko sprawdzasz, czy podana liczba jest w kolekcji i wypisujesz odpowiednią wartość.

2

Pamiętaj, że ten program jest pisany dla ROBOTA, a nie człowieka!
Ergo wolno ci wypisywać tylko to co jest opisane w zdaniu i masz wczytywać dokładnie jak to jest opisane.
Nic więcej, ani mniej, wiec wywal: Console.WriteLine("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze");

int liczbaTestow = int.Parse(Console.ReadLine());

for (int i = 0; i<liczbaTestow; ++i)
{
      int liczba =  int.Parse(Console.ReadLine());
      Console.WriteLine(CzyPierwsza(liczba)?"TAK":"NIE");
}

Kod funkcji CzyPierwsza napisz sobie sam.

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