57 / 77
Apr 2017

sprawdzanie zakresu danych podanych tekście zadania jest niezalecane - to problem autora

sprawdzanie w taki sposób, jak to zrobiłeś jest podwójnie niezalecane

Oto mój kod, w kompilatorze wszystko działa, ale nie zalicza mi zadania. Pomoże ktoś?

include

using namespace std;

int main(){
int n;
int suma = 0;

cin >> n;

for(int i = 1; i <= n; i++){
	if(n%i == 0){
		suma++;
	}
}
if(suma==2 && n>1){
	cout << "TAK" << endl;
}else{
	cout << "NIE" << endl;
}
return 0;

}

nie bardzo rozumiem, co to znaczy: w kompilatorze wszystko działa - czy to, że program się kompiluje ?

doskonale za to rozumiem: ale nie zalicza mi zadania - i słusznie, bo program daje rozwiązanie innego problemu, niż podano w zadaniu - przeczytaj uważnie jeszcze raz (dwa, trzy, ... aż do zrozumienia) treść zadania

Nie będę oryginalny program się kompiluje, mi wydaję się że wszystko jest w porządku jednak sędzia nie uznaje...

udało się ogarnać dzięki za pomoc wyrzucam kod

Masz o jeden nawias za dużo. Po co Ci ten warunek:

Zobacz sobie test:
2
100
50

Ta pętla jest dla mnie dzika. Spróbuj ją jeszcze raz zdefiniować. Zrób sobie nieskończoną pętle for, zadeklaruj jednostkę pomocniczą (zorientujesz się o jakiej wartości), inkrementuj ją i nie zapomnij o przerwaniu funkcji jak zostanie spełniony warunek. Wydaje mi się, że to najłatwiejszy sposób. Ale jestem początkujący więc mogę się mylić :slight_smile: Powodzenia :slight_smile:

zmieniając pętle for (j= 2; j<=sqrt(liczba); j++) na (j= 2; j<liczba; j++) warunek

else if (liczba ==3) {
cout << "TAK" << endl;}

stawał się niekonieczny, po wprowadzeniu dodatkowej zmiennej do pętli zadziałało
tak że dzięki i pozdrawiam

11 days later

include

using namespace std;
int y,x,d=0;
int main()
{
cin>>y;
for (int i=1; i<=y; i++)
{cin>> x;
for (int i=1; i<=x; i++)
{
if(x%i==0)
d++;
}
if (d==2)
cout<<"TAK"<<endl;
else
cout<<"NIE"<<endl;
}

return 0;

}

Czy rzeczywiście jest tu jakiś błąd?

a czy zrobiłeś jakieś testy ?

bo gdybyś zrobił, to byś wiedział, że jest (a nawet więcej niż jeden, bo ja widzę dwa, co nie znaczy, że nie ma więcej)

Ująłbym to tak:
Nieumiejętne i niuuzasadnione stosowanie zmiennych globalnych, prowadzące do naiwnego myślenia, że zmienna globalna załatwia "sprawę".

PS
Sama metoda sprawdzania [aby nie obrażać algorytmu] jest bardzo nieoptymalna.

2 months later

co działa? Zapoznaj się z definicją liczb pierwszych. Sprawdź później np. 121

1 month later

Jakieś sugestie?

okulary? :wink:
okulista?

A potem porównaj twój output z przykładem z zadania.

  • twój kod nie działa dla testu pod zadaniem
  • wielkość liter na wyjściu ma znaczenie
  • nie musisz zapisywać wejścia, możesz wywołać swoją funkcję first dla wczytanej wartości i wypisać wynik
  • twoja funkcja first nie zwraca nigdy true

powrót do szkoły podstawowej, aby nauczyć się czytać ze zrozumieniem proste teksty ?

bo nawet tego prostego testu z zadania nie wykonuje poprawnie

Na tak postawione pytanie [+załączony kod] trudno znaleźć rozsądną podpowiedź. Nie wiadomo czy pytający chodzi jeszcze do szkoły podstawowej i czy może przypadskiem nosi okulary [jak ja]. Nie wiadomo, czy pytający, wie, że ma błędnie działający program, i potrzebuje tylko małej pomocy i naprowadzenia, w znalezieniu błędu, czy też nie widzi błędu i uważa, że jego program działa bezbłędnie.

Wygląda, że sugestie, niezadziałały, więc:

  1. “TAK” != “Tak”
  2. “NIE” != “Nie”
  3. Testów może być do 100 000 a nie 10 000 - przeczytaj dokładniej treść zadania.
  4. W funkcji first(…) brakuje na końcu return true - swoją drogą lepszą nazwą funkcji byłoby np: isPrime(…), w języku angielskim, liczby pierwsze, to prime numbers, a nie first numbers


Mniej istotne uwagi:

  1. Staraj się używać zmiennych lokalnych a nie globalnych.
  2. Sprawdzanie czy liczba jest pierwszą, można zakończyć o wiele szybciej, poczytaj o tym.
  3. Dobrze jest używać funkcji, ale ich nadmiar już nie jest dobrym pomysłem.

PS

Też tak kiedyś podpowiadałem, ale okazuje się, że w tym wypadku, najpierw wczytanie całego wejścia od razu do odpowiednio dużej tablicy [bufora], a dopiero potem wykonanie “obliczeń” skutkuje kilkakrotnie szybciej działającym programem - 0.15 vs 0.03 sek. Mam na myśli tylko tą jedną zmianę, bez żadnych innych przyśpieszaczy w rodzaaju wyłączania synchro. Możliwe więc, że warto zrewidować swoje poglądy i za każdym razem sprawdzić, zanim się podpowie :wink:

Ale chyba nie za pomocą strumieni jedna wartość po drugiej? :open_mouth:

Właśnie tak, i to nawet bez wyłączania synchronizacji:

for (int i = 0; i < how_much;  i++)
        cin >> how[i];

Możesz sam sprawdzić i się przekonać (c++14, gcc 6.3). Możliwe, że to [nowy] kompilator tak ostro optymalizuje taką pętlę, nie wiem.

Może bez tak wielkiej różnicy, ale zdarzyły mi się tego rodzaju cudeńka na SPOJu. Nie zwracałem na nie jednak uwagi traktując je jako anomalie w działaniu sędziego.

Nie sądzę, aby należało zrewidować swoje poglądy co do przypadku ogólnego. Swoją drogą - dlatego też nie praktykuję teorii śrubowania czasów na SPOJu :wink: Tablice mogą wydawać się początkującym bardziej intuicyjne, ale w rzeczywistości ich niepotrzebne użycie jest błędem w sztuce i tyle. (Zwykle przypadkowe) poprawienie czasu o ułamek sekundy nie jest żadnym usprawiedliwieniem dla ich użycia, jeżeli nie było to konieczne.

PS http://pl.spoj.com/problems/AL_23_01/1. Zadanie polecam rozwiązać tablicą i kolejką, a następnie porównać rozwiązania pod względem wydajnościowym, złożonością kodu i możliwością zastosowania w praktyce.