Problem ze sprawdzeniem czy liczba jest pierwsza

0

Witam,
Tworząc program na zajęcia szkolne natknąłem się na pewien problem z działaniem kodu. Po kompilacji, gdy program "sprawdza" czy liczby są pierwsze, jeśli odkryje, że podana l.naturalna nie jest pierwsza - kończy działanie i nie "sprawdza" drugiej liczby. Zauważyłem, w którym miejscu trzeba byłoby to poprawić, jednakże po wielu próbach i tak mi się nie udało. Potrzebuje zapewne prostego oświecenia, pozdrawiam serdecznie :)

(Nie jestem w stanie załączyć pliku z niewiadomych przyczyn, wklejam kod poniżej)

/*
	Napisać program, który:
		1. Losuje liczbę z zakresu <1,100> lub <a,b>
		2. Pobiera od użytkownika dowolną liczbę naturalną
		3. Sprawdza, czy obie liczby są względnie pierwsze, czyli ich jednynym wspólnym dzielnikiem jest 1
*/
#include <iostream>
#include <conio.h>
#include <math.h>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{

    long long int liczba, liczba2;
    long long int a,b;
    int decyzja;
	setlocale (LC_ALL, "");

	cout << " ***Tytuł programu*** " << endl;

	cout << "\nCzy chcesz podać własny zakres <a,b>? 0->nie 1->tak. Wybierz opcję i kliknij ENTER\n";
	cin >> decyzja;
        if (decyzja == 1)
        {
        cout << "\nPodaj wartość a: ";
        cin >> a;
        cout << "\nPodaj wartość b: ";
        cin >> b;
        srand(time(NULL));
        liczba = a + rand()%(b-a+1);
        cout << "\nLiczba w zakresie <a,b> to: " << liczba << endl;
        }
        else
        {
        srand(time(NULL));
        liczba = 1 + rand()%(100);
        cout << "\nLiczba w zakresie <1,100> to: " << liczba << endl;
        }

    cout << "\nPodaj dowolną liczbę naturalną: ";
    cin >> liczba2;
    for(int p=2; p<liczba2; p++)
    	if(liczba2 % p == 0)
    	{
            cout << "\nPodana l.naturalna nie jest liczbą pierwszą!" << endl;
            return 0;
    	}
    	cout << "\nPodana l.naturalna jest liczbą pierwszą!" << endl;
    	return 0;


    for(int q=2; q<liczba; q++)
		if(liczba % q == 0)
        {
            cout << "\nWylosowana liczba to nie liczba pierwsza!" << endl;
            return 0;
		}
		cout << "\nWylosowana liczba to liczba pierwsza!" << endl;
		return 0;


	return 0;
}
2

Ok, ale twój program robi zupełnie co innego niż masz w komentarzu

1

Już nie mówiąc o tym że program mówi o względnej pierwszości, a potem zaczyna sobie liczyć czy liczby są pierwsze...
Myślałeś żeby usunąć te return 0 tam gdzie tego nie chcesz?

0

Mogłem źle określić funkcję programu, jeśli to kogoś zmyliło to najmocniej przepraszam. Co do usunięcia return 0 - gdy to zrobiłem to w zadanej linijce zamiast jednego zdania wyskakiwało kilka, dodatkowo błędnych. Załączam zrzut ekranu. return.PNG

1

Zrob najlepiej sito Erastotelesa Erastotenesa i forem sobie mozesz szybko sprawdzic dowolnie duzo liczb po prostu zagladajac do tablicy :)

https://pl.wikipedia.org/wiki/Sito_Eratostenesa

0

Masz cout w pętli dlatego drukuje ci się to kilkukrotnie ...

1
4matey napisał(a):

Masz cout w pętli dlatego drukuje ci się to kilkukrotnie ...

Dodam, kolega ma błędne formatowanie, i to myli. Najpierw jego samego.

@tomas11: Jakbyś to miał w funkcjach, a nie masakrował main'a, tobie samemu by było lepiej

2

@tomas11: Jakbyś trochę poszukał wiedzy, to wystarczy sprawdzić, czy gcd tych liczb jest równe jeden.
https://en.wikipedia.org/wiki/Greatest_common_divisor

0

Zmieniłem koncept kodu inspirując się komentarzem @stivens i wykorzystałem Algorytm Euklidesa do wyszukiwania względnych liczb pierwszych. Dziękuje wszystkim za pomoc :)

1


2

Ja się jeszcze przyczepie do stylu kodowania.
Wszystko umieściłeś w main staraj się dzielić kod na mniejsze funkcje reprezentujące logiczne części.
Łatwiej będzie ci pisać i czytać taki kod, a co ważniejsze innym będzie łatwiej go poprawiać.
IMHO ta rada jet nawet ważniejsza od wszystkiego powyżej. Im szybciej oduczysz się pisać wszystko w jednej wielkie funkcji tym lepiej.

Tu masz przykład sita Eratostenesa wykonanego z constexpr jaki naskrobałem parę lat temu.

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