90 / 277
Aug 2017

@flimbo123 Witamy na spoju. Jeżeli w zadaniu jest napisane, że wejście jest z przedziału [1..10000] to tak będzie. Twój program, który sprawdza dzielniki do 5 włącznie nie poradzi sobie chociażby z 49, która nie jest pierwszą. W internecie bez problemu znajdziesz informacje jaka jest zależność pomiędzy dzielnikami, które należy sprawdzić, a testem czy liczba jest pierwsza.
Zawsze najpierw szukaj informacji w sieci, sprawdź dla przykładu spod zadania, dla minimalnego zakresu danych jaki jest możliwy w zadaniu i dla jakiegoś prostego testu, który szybko sprawdzisz. Ja bym napisał taki zanim był cokolwiek wysłał:

15
1
2
3
4
5
6
24
25
26
27
28
29
49
100
10000

Odpowiedzi spokojnie policzysz w głowie.

@tarpauwatratar Nie mówię, że nie masz racji, ale bądź rzeczowy w swoich odpowiedziach, nie potrzeba tutaj odnosić się do czegokolwiek niż kod. Wszak spoj to polska śmietanka intelektualna :slight_smile:

Czy to nie jest rzeczowe? :wink:

Mogłem napisać: weź się do roboty! Mogłem napisać: weź się do roboty i sprawdź np. 29, 49, 100, .... Wolałem jednak napisać jasno jak wygląda sytuacja i jaki jest jej odbiór wśród owej śmietanki intelektualnej (wszak sam nie mówisz, że nie mam racji, a zatem w mojej odpowiedzi jest choć trochę prawdy :wink:).

Zauważ też, że punkty 1), 2), 3), 4), 5), a w pewnym stopniu także 6) i 7), choć odniesione do konkretnej sytuacji, mają łatwy do wyłuskania charakter ogólny. Chcąc rozwiązać zadanie należy najpierw je zrozumieć (np. sprawdzić definicję liczby pierwszej), potem stworzyć i przetestować rozwiązanie, a w razie niepowodzenia próbować kolejnych testów i ewentualnie przejść na forum. Z kolei forum należy najpierw przeszukać, a następnie zakładać nowe tematy itd itp.

Nie jestem skłonny zgodzić się, że nie ma potrzeby odnosić się do czegokolwiek innego niż kod. Wszak metodologia pracy jest bardzo istotna, a może nawet istotniejsza od samego kodu. Składni może nauczyć się każdy, programować już nie, do czego zresztą pośrednio odniósł się @mariusz193. Uważam, że lepiej napisać jak wygląda sytuacja (nawet jeżeli tylko tak wygląda, a w rzeczywistości jest inaczej - zakładam dobrą wolę @flimbo123, ale opisuję sytuację taką, jaką mi się ona jawi) w ostrych słowach i za wczasu. Każdy był kiedyś nowicjuszem, a na problemy na SPOJu z tego okresu nikt się nie patrzy (jestem tego żywym dowodem, a warto wspomnieć, że z testowaniem miałem największe trudności, a wciąż bywa z tym różnie :wink:). Łapka w dół i negatywny komentarz na Stack Overflow boli dużo bardziej, a na GitHubie nie jest ciężko natknąć się na tragiczny kod, którego autor nie przeanalizował / przetestował / sprawdził / wyszukał różnych rzeczy. Gdyby nie ostra krytyka innych sam zszargałbym swoją opinię publikując coś, co na ogół nie powinno ujrzeć światła dziennego :wink: Gdyby @flimbo123 poszedł programować zawodowo to mógłby zostać zapytany o sposób, w jaki radzi sobie z trudnościami w realizacji projektów, a nawet mógłby zostać poproszony o napisanie jakiegoś prostego programu, np. do wyznaczania liczb pierwszych. Gdyby program nie działał prawidłowo, a kandydat ratował się ifowaniem kolejnych przypadków... cóż...

I myślę, że wystarczy już tego spamu - dalej wypowiadam się już tylko o zadaniu :wink:

1 month later

Cześć Wam, mam problem z zadaniem: http://www.spoj.com/problems/PRIME1/2
Mianowicie za każdym razem otrzymuję wynik "time limit exceeded". Dlaczego? Jakieś podpowiedzi?

include

include

using namespace std;

int number;
int counter = 0;
int *wsk = &counter;

int count();
void range(int[], int, int*);
void prim(int[], int);

int main() {
int n = 0;
int *array = new int[n];
int i = 0;
n = count();
//cout << n << endl;

while (i < n) {
	range(array, n, &counter);
	i++;
}

//for (int i = 0; i < 2*n; i++) {
//	cout << array[i] << endl;
//}
n = n*2-1;

prim(array, n);



system("pause");

return 0;

}

int count() {
int n;
cout << "Podaj ilość zakresów\n";
cin >> n;
return n;
}

void range(int array[], int n, int *wsk) {
int a, b;
while (counter<2*n) {

	cin >> a;
	array[counter] = a;
	counter++;

	cin >> b;		
	array[counter] = b;
	counter++;

//	cout << endl<<array[counter - 2] << endl << array[counter-1];
}

}

void prim(int array[], int n) {

int i = 0;
int dol, gora, modulo,licznik;
int flaga = 1;
while (i <= n ){
	dol = array[i];
	gora = array[i + 1];
	
	if (dol == 1)
		dol++;

	for (dol; dol <= gora; dol++) {
		
		licznik = 2;
		modulo = dol % licznik ;
		while (modulo != 0 && licznik<dol/2) {
			licznik++;
			modulo = dol % licznik;
			if (modulo != 0)
				flaga = 0;
			else
				flaga = 1;
			
		}
		
	
		if (dol == 2 || dol ==3)
			flaga = 0;
		if (flaga == 0)
			printf("%d\n", dol);
			
			//	cout << dol << endl;
		flaga = 1;
	}


	i+=2;
	printf("\n");
}

}

13 days later

proszę bardzo:

1) przeczytaj ten wątek (cały)
2) przeczytaj ogólnie dostępne, podstawowe informacje o liczbach pierwszych
3) wyrzuć ten kod
4) napisz program od początku

Hej :slight_smile: Zwracam się z prośbą o pomoc :slight_smile: W mojej opinii wyniki wychodzą prawidłowo, wydaje mi się, że problem jest wtedy, gdy podaję liczbę do sprawdzenia większą niż 10000, ale nie jestem pewien czy o to chodzi... Podaję kod http://pl.spoj.com/submit/PRIME_T/id=200049428, będę wdzięczny za pomoc i ocenę jakości kodu :wink:

Wysłany kod pod tym linkiem widzisz tylko Ty.

Myślałem, że autor sam się domyśli :wink: Szczególnie, że gdziekolwiek nie spojrzeć ludzie inaczej wklejają kod, takie wpadki sporadycznie zdarzały się innym, a do tego kod na SPOJu ma być niejawny.

No to teraz pogadamy :wink:

  1. if (liczba_testow < 100000) - wywalić to. Warunki zadania są dane przez autora i nie należy ich sprawdzać. To samo dotyczy dalszej części zadania, np. sprawdzania, czy liczba nie jest ujemna.
  2. Twój program nie działa nawet dla przykładowego wejścia więc najpierw zrób tak, żeby w ogóle był choć cień szansy, że on działa, a po tej poprawce wstaw kod i szukam dalej :wink:

To nie jest przykładowe wejście. Patrz: treść zadania.

Insza inszość, że dla podanych przez Ciebie danych też działa źle :stuck_out_tongue:

Dobra, już sobie poradziłem :slight_smile: Błąd był śmieszny, aż wstyd się przyznać... -.-

Dzięki tarpauwatratar za chęć pomocy, fajnie, że ktoś się interesuje przynajmniej na tym forum :slight_smile:

Przyzwyczajaj się :wink: Błędy są na ogół śmieszne, głupie i wstyd się do nich przyznać :wink: Niemniej na błędach ludzie uczą się najwięcej.

Interesuje się więcej osób niż ja :wink: Kwestia tego, że niewielu ma czas by pomagać (za darmo).

No tak, kasa kasa kasa :stuck_out_tongue: Za darmo nawet już w ryj nie można dostać...

Tak, ale jest jeszcze inna sprawa. Patrolowanie SPOJa zajmuje dużo czasu, a trzeba też zarobić na życie :wink:

PS
Poszukaj czegoś o sicie Eratostenesa. Na przyszłość.

Oj nie narzekaj, mogę Ci dać, jak już tak prosisz :wink: