Wyznaczenie liczby pierwszej.

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;
}
0
  1. Masz źle ponieważ:

n - liczba testów n<100000

  1. Poczytaj o sicie Eratostenesa
  2. Nie musisz magazynować wejścia
  3. 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;
  }
0

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

0

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

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


3

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ż.

0

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

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