Gdzie jest błąd?

0

Dzień dobry,
starałem się napisać kod, który wpierw pobiera ilość prób, następnie pobiera przedział liczb, a z niego sprawdza, które liczby są liczbami pierwszymi. Program nawet działał... ale przestał jak wprowadziłem dodatkowy warunek p==1.. i nie wiem dlaczego, ale nawet gdy teraz wywalę ten warunek spod ifa - program nadal nie chce działać.. Pewnie jakiś mały, głupi błąd, ale już 30 minut szukam i nie widzę co może być źle.. Będę wdzięczny za pomoc

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int prime(int p) {
	int j = 2;
	int r = sqrt(p);
	while (j <= r) if (!(p%j++) || p == 1) return 0;	
	return 1;
}

int main() {
	int n, m, p, t;
	
	scanf("%d", &t);
	for (int i = 0; i<t;++i)
		{
			scanf("%d %d", &m, &n);
			for (p = m; p <= n; ++p)
			{
				if (prime(p)) printf("%d ", p);
			}
		}
	return 0;
}

#EDIT
A i jeszcze jedno pytanie - czemu nie mogę zrobić "while (j <= sqrt(p))"? Program wtedy też nie chciał działać jak należy.

2

Problem w tym, że nie wiadomo co znaczy Twoje 'nie chce działać'. Nie kompiluje się? Wyświetla jakieś błędy? Może wywala się po wpisaniu jakiś danych? Jeśli tak, to jakich? Może po prostu zwraca zły wynik? Napisz konkretnie co jest nie tak, jakie dane podajesz na wejściu i co dostajesz na wyjściu a co spodziewasz się dostać.

0

Jasne, problem polega na tym, że po wpisaniu np.
2
1 10
Program zwraca albo 1 albo nic. (w zależności od wspomnianego wcześniej ifa oczywiscie) i nie wiem dlaczego. A działało. Wypisywał
1 2 3 5 7 - (stąd dodałem ten dodatkowy warunek do ifa)

A co do tego while (j <= sqrt(p)) - program wyświetlał złe wyniki

4

Program zwraca albo 1 albo nic.
Śmiem wątpić: http://ideone.com/11PVxu

while (j <= r) if (!(p%j++) || p == 1) return 0;

Nie pisz takich potworków, za linie kodu nie płacisz. To powinno co najmniej tak wyglądać:

while (j <= r)
    if (!(p % j++) || p == 1)
        return 0;
 if (!(p % j++) || p == 1)

To !(p % j++) aż się prosi o błąd. Nie łącz zbyt wielu rzeczy w jedną instrukcję.

for (int j = 2; j <= r; ++j)
    if (p % j == 0)
        return 0;

przypadek p == 1 powinien być sprawdzany raz na początku, a nie w pętli co zaciemnia kod.

0

Dzięki za rady twonek!
Tylko z jakiegoś powodu, mi nadal program nie wypisuje dobrze. Spójrz na screen:
user image
Masz jakiś pomysł czemu tak się dzieje?

EDIT

I znowu... przez chwilę liczył dobrze i przestał x) Nie ogarniam co się z tym dzieje.. A na ideone działa! Więc Visual musi być jakiś skopany.

A i jeszcze pytanie na boku - czy da się w visualu w języku C podglądać wartości wszystkich zmiennych w trakcie debugowania? Bo z tego co kojarzę, to powinny mi się wypisywać w okienku Autos.. ale z jakiegoś powodu mam to puste :P

1

Pokaż cały kod, jako tekst, a nie obrazek, całe dane wejściowe i wyjściowe.

0

Wybacz, jestem już trochę rozkojarzony przez to..

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int prime(int p) {
	int j = 2;
	int r = sqrt(p);
	if (p == 1) return 0;
	for (int j = 2; j <= r; ++j)
		if (p % j == 0)
			return 0;
	return 1;
}

int main() {
	int n, m, p, t;

	scanf("%d", &t);
	for (int i = 0; i<t; ++i)
	{
		scanf("%d %d", &m, &n);
		for (p = m; p <= n; ++p)
		{
			if (prime(p)) printf("%d\n", p);
		}
	}
	return 0;
} 

Dane wejściowe:
3
1 10
3 5
Dane wyjściowe:

1

Prędzej uwierzę, że uruchamiasz starą binarkę niż to że kompilator źle działa przy takim banalnym programie. Wyczyść projekt, zbuduj ponownie i uruchom. Albo dla pewności stwórz nowy projekt i skompiluj kod.

0

Dziwi mnie to, że raz działało, a potem przestało. Przebudowywałem, czyściłem, pisałem od nowa, kompilowałem na osobnym, czystym projekcie - nadal to samo. Nie wiem, może to być kwestia antywirusa?

4

Brakuje podłączonego <math.h>: http://ideone.com/W6S3yi

0

Dzięki! Tylko nie rozumiem tego - czemu na ideone to działało bez tego nagłówka? o.O Jest ktoś w stanie mi to wyjaśnić?

3

Nagłówki biblioteki standardowej mają prawo się dowolnie nawzajem inkludować.

0

Chrzani waść: http://ideone.com/0eMotY

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