Wyznaczenie liczby pierwszej.

Odpowiedz Nowy wątek
2014-12-14 22:29
0

Witam,
Załęczem trochę bawić się C++ i polskim SPOJ'em staram się rozwiązać 1 zadanie o nazwie PRIME_T http://pl.spoj.com/problems/PRIME_T/
Cały czas mam, że odpowiedź jest błędna, nie wiem już co można zmienić.
Może ktoś mądrzejszy spojrzy co robię źle. Wydaje mi się, że poprawnie wyznacza liczby pierwsze
Poniżej zamieszczam kod:

#include <iostream>
#include <math.h>
 
bool isPrime(int);
 
int main()
{
    unsigned int numberOfLoops;
    std::cin >> numberOfLoops;
    bool answer[10000];
 
    for (int i = 0; i < numberOfLoops; i++)
    {
        unsigned int numbertoCheck;
        std::cin >> numbertoCheck;
        if (isPrime(numbertoCheck))
            answer[i] = true;
 
        else
            answer[i] = false;
    }
    for (int i = 0; i < numberOfLoops; i++)
    {
        if (answer[i])
        {
            std::cout << "Tak" << std::endl;
        }
        else std::cout << "Nie" << std::endl;
    }
    return 0;
}
bool isPrime(int number)
{
    if (number == 1) return false;
    if (number == 2) return true;
    if (number == 3) return true;
    if (number == 4) return false;
    for (int i = 2; i <= sqrt(number); i++)
    {
        if ((number % i) == 0)
        {
            return false;
        }
    }
    return true;
}

Pozostało 580 znaków

2014-12-14 22:41
0
  1. Masz źle ponieważ:

    n - liczba testów n<100000

  2. Poczytaj o sicie Eratostenesa

  3. Nie musisz magazynować wejścia

  4. Ten kod przechodzi poprawnie:

     
    #include <iostream>
    using namespace std;

int main()
{
static bool Tb[10001]={true,true};
for(unsigned i=2;i<=100;++i) if(!Tb[i]) for(unsigned k=i*i;k<10001;k+=i) Tb[k]=true;
unsigned T,X;
for(cin>>T>>X;T--;cout<<(Tb[X]?"NIE":"TAK")<<endl) cin>>X;
return 0;
}


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-14 22:41

Pozostało 580 znaków

2014-12-15 15:38
0

numberOfLoops to u mnie jest n. To unsigned int nie starczy dla 100 000 liczb ?

Pozostało 580 znaków

2014-12-15 16:08
0

nie! bool answer[10000]; jest za małe. Tak na prawdę to answer to zbędne, załatw to jedną pętlą.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2014-12-15 16:38
0

Niestety tez nie zalatwilo sprawy. Odpowiedz dalej jest bledna.
Wydaje mi sie, ze samo wyznaczanie czy liczba jest pierwsza jest poprawne, blad musi tkkwic w innym miejscu... :/

#include <iostream>
#include <math.h>
 
bool isPrime(int);
 
int main()
{
    unsigned int numberOfLoops;
    std::cin >> numberOfLoops;
    bool answer[10000];
 
    for (int i = 0; i < numberOfLoops; i++)
    {
        unsigned int numbertoCheck;
        std::cin >> numbertoCheck;
        if (isPrime(numbertoCheck))
            std::cout << "Tak" << std::endl;
 
        else
            std::cout << "Nie" << std::endl;
    }
    return 0;
}
bool isPrime(int number)
{
    if (number == 1) return false;
    if (number == 2) return true;
    if (number == 3) return true;
    if (number == 4) return false;
    for (int i = 2; i <= sqrt(number); i++)
    {
        if ((number % i) == 0)
        {
            return false;
        }
    }
    return true;
}
 

Pozostało 580 znaków

2014-12-15 17:06
sig

Na początek zamień Tak i Nie na TAK i NIE, SPOJ jest "czuły" na wielkość liter. Być może coś jeszcze, ale chwilowo mam "oczekiwanie na wykonanie" więc nie wiem czy te poprawki wystarczą. Swoją drogą zainteresuj się sitem, skoro liczba nie jest podzielna przez 2, to przez wielokrotności 2 też.

Pozostało 580 znaków

2014-12-15 19:11
0

Zmiana wielkosci liter zalatwila sprawe... :) A tyle sie naglowilem nad tym, ale nuczka jest. Trzeba dokladnie wprowadzac wymagania klienta. :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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