75 / 277
May 2017

Chciałem łatwo zmieniać zmienne w pętli for.

Poprawiłem lekko kod i przeszło: usunąłem niepotrzebną tablice oraz w if (czy_pierwsza(liczba[i]) && liczba[i] <2) usunąłem drugi warunek.

to teraz usuń cały kod

tablica miała zły rozmiar, tylko 3 elementy

1 month later

kod:

#include <iostream>
using namespace std;

long int n;

bool czy_pierwsza(long int liczba){
    if(liczba < 2) return false;

    for(int i=2;i<(liczba/2);i++)
        if(liczba % i == 0) return false;

    return true;
}

int main()
{
    long int liczby[10000];
    cin>>n;

        for(int i=0;i<n;i++){
            cin>>liczby[i];
        }
    cout<<endl;

    for(int i=0;i<n;i++){
        if(czy_pierwsza(liczby[i]) == true) cout<<"TAK"<<endl;
        else cout<<"NIE"<<endl;
    }

    return 0;
}

otóż wrzucam te rozwiązanie do pierwszego zadania LICZBY PIERWSZE z łatwego działu, wybieram każdy z możliwych kompilatorów i za każdym razem "BŁĄD ODCZYTU". Co nie tak?

Pierwszy raz spotykam się z takim komunikatem na spoj.
Próbowałeś wrzucać samo main ?( bez żadnego kodu ) Albo testować na ideone ?

Przy twoim zadaniu jest komunikat błąd wykonania (SIGSEGV) (a nie błąd odczytu)

Witam

Stawiam pierwsze kroki zarówno w c++ jak i na tym forum. Zabrałem się za pierwsze zadanie z listy i padło na liczby pierwsze. Program wydaje mi się działać na moim kompilatorze jednak sędzia odrzuca moje rozwiązanie. Czy ktoś by mógł spróbować podpowiedzieć mi dlaczego?

#include <iostream>

using namespace std;
int testy, liczby, wynik, suma;
int n=0;
int tab[10000];
int main()
{
    cin>>testy;
    for(int i=0; i<testy;i++)
    {
        cin>>liczby;
        for(int j=2; j<=liczby; j++)
        {
            wynik= liczby%j;
            if (wynik!=0)
                n++;

        }
         if (n!=liczby-2)
                tab[i]=1;
                else
                tab[i]=0;
                n=0;
    }
    for(int k=0; k<testy; k++)
        if (tab[k]==1)
            cout<<"NIE"<<endl;
        else
            cout<<"TAK"<<endl;
    return 0;
}

Z góry dziękuję.

ciekawe, bo wg mnie powinien zgłosić nie błędną odpowiedź, ale błąd wykonania (SIGSEGV)
(młodsze wersje C++ to zgłaszają)

zobacz, co oznacza błąd wykonania (SIGSEGV)8, przeczytaj jeszcze raz treść zadania i popatrz na twój program

24 days later

przecież 1 jest liczbą pierwszą więc nie wiem w czym problem
@dobra poczytałem i jednak nie, przepraszam

Poprawiłem i nadal nie działa: http://ideone.com/rP0fQU13 aż mi wstyd że takie proste zadanie przysparza mi tyle problemów

Jedyne co zrobiłeś to if [przykładowe wejście z zadania] then [wyświetl przykładowe wyjście]. Zacznij testować swoje programy dla jakichkolwiek danych albo nie licz na żadną pomoc. Bez urazy, ale jeżeli:

1) nie zapoznałeś się z definicją liczby pierwszej,
2) jeżeli mnie pamięć nie myli wysłałeś tylko jedno zgłoszenie na SPOJa przed napisaniem na forum (jeżeli pamięć mnie myli to i tak bez znaczenia z powodów 1), 6) i 7), które dostatecznie sugerują, że nawet nie chcesz (samodzielnie) rozwiązać tego zadania),
3) nie przeczytałeś jak zakładać tematy na forum,
4) nie zrobiłeś żadnego researchu, zarówno na forum jak i w innych źródłach,
5) założyłeś nowy wątek w niewłaściwym miejscu i jak pamiętam z nieprawidłową nazwą (jeżeli pamięć mnie myli to i tak bez znaczenia, bo zgrzeszyłeś 3) i 4) i założeniem wątku w niewłaściwym miejscu, co w połączeniu z innymi faktami prowadzi do konkluzji przedstawionej poniżej),
6) po otrzymaniu odpowiedzi nawet nie chciało Ci się od razu wyszukać definicji liczby pierwszej - wolałeś zacząć od: "przecież 1 jest liczbą pierwszą więc nie wiem w czym problem",
7) Po sprawdzeniu czy 1 jest liczbą pierwszą napisałeś: "@dobra poczytałem i jednak nie, przepraszam" i wprowadziłeś kolejnego ifa do kodu - nie przetestowałeś swojego programu dla żadnych innych liczb;

to możliwe są trzy opcje (sprawdź definicję alternatywy): oczekujesz, że ktoś zrobi to zadanie za Ciebie lub jesteś za głupi nawet na (jak słusznie zauważyłeś) "takie proste zadanie". W każdym z trzech przypadków nie warto Ci pomagać.

Jeżeli chcesz zatrzeć falstart to kilka podpowiedzi: co z np. 49? Jest pierwsza czy nie? A co z np. 77, 133, 143, ... 1981? Samodzielnie sprawdź, czy wymienione przeze mnie liczby są pierwsze czy złożone oraz jak w ich przypadku zachowa się Twój program.

EDIT
Wątek był w złym miejscu, ale został tu doklejony.

Zupełnie niesłusznie czepiasz się człowieka :slight_smile:

a przecież on tylko pewnie uwierzył w reklamę na pierwszej stronie spoj-a:

Zrobimy z Ciebie programistę! Wystarczy tylko 6 tygodni

(i nie sprawdził, że 6 tygodni nie wystarczy, potrzeba jeszcze od 12 do 14 tysięcy za jeden kurs, oraz nie ma doświadczenia, by wiedzieć, że dla 99% uczestników tego kursu będą to wyjątkowo głupio wydane pieniądze)

@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: