Liczba pierwsza

0

Cześc, mam zrobić program, który sprawdza czy liczba podana z klawiatury jest liczbą pierwszą. To już mam zrobione. Drugą cześcią zadanie jest znalezienie najbliższej liczby pierwszej ( mniejszej i większej).

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>

 using namespace std;

int main()
{
int L,D=1,R,ILE=0,LM,LW; // LM i LW to Liczba większa i liczba mniejsza
cout << " \n\n                   Sprawdzam czy liczba L to liczba pierwsza ";
cout << "\n Podaj liczbe -> ";
cin >> L;

	while(D<=L)
	{
		R=L % D;
			if(R==0)
			{
				ILE++;
				D++;
			}
			else
			D++;
	}
	if(ILE==2)
		cout << " Liczba "<<  L << " to liczba pierwsza ";
	else 
	
	cout << " Liczba "<<  L << " to nie jest liczba pierwsza ";

	

 	getch();
   return 0;
}

Nie mam pojęcia jak zrobić reszte zadania, próbowałem na różne sposoby ale porgram po prostu nic nie robił >:(
Mógłby ktoś pomóć?
Z góry przepraszam jeśli post się powtarza.

0
newbie123 napisał(a):

Drugą cześcią zadanie jest znalezienie najbliższej liczby pierwszej ( mniejszej i większej).

edit z konta; miałem na myśli znalezienie najbliższej liczby pierwszej jeśli liczba która była sprawdzana nie jest liczbą pierwszą.

1
int LM,LW; // LM i LW to Liczba większa i liczba mniejsza

Ten komentarz oznacza że trzeba poprawić kod i umyślnie nazywać zmienne.
Zaleca się używania języka angielskiego, więc twoje zmienne mogą się nazywać

int lowest, highest;

Poza tym zamiast robić tak:

R=L % D;
            if(R==0)
            {
                ILE++;
                D++;
            }

wpakuj do wszystko do ifa i pozbędziesz się zmiennej R

if(L % D == 0)
{
	ILE++;
	D++;
}
0

Widzę, że sprawdzasz ile dzielników ma dana liczba. Oprócz tego, że mógłbyś wychodzić z pętli po znalezieniu trzech dzielników (bo wtedy wiadomo, że liczba jest złożona) to w przypadku tego zadania wygodniej byłoby użyć Sita Eratostenesa do znalezienia liczb pierwszych do mniejszych od L - wtedy albo dostałbyś, że L jest ostatnią znalezioną liczbę pierwszą, a w przeciwnym przypadku wziął dwie ostatnie liczby pierwsze, jedna jest mniejsza od L, a druga od niej większa.

0

Najprostsze rozwiązanie to Zamknąć logikę sprawdzania czy liczba jest pierwsza w funkcji, i teraz:

  • Jeśli dana liczba jest nieparzysta, to w pętli testujemy co drugą liczbę, w prawo i w lewo;
  • Jeśli jest parzysta, to robimy ruch o jeden w prawo i lewo i taka sama pętla sprawdzająca, co drugą liczbę.

Jeśli funkcja is_prime będzie wydajna, to powinno być szybkie, do jakiś w miarę liczb, nie za wielkich.

0

Kod, algorytm naiwny (ciekawe jak to optymalizować?), zrobiłem to na 64 - cztero bitowych intach, bo na zwykłych to nie ma nic do liczenia:), bez komentarzy, bo rozdzielone czytelnie na funkcje, wartość zwracana to struktura: para liczb:

// 4programmers,  simple next_prime(n) and prev_prime(n)

#include <iostream>
#include <cmath>

using namespace std;
typedef unsigned long long int uns_long;

class Pair {
	public: 
	uns_long a;
	uns_long b;
	public : Pair(uns_long x, uns_long y) {
		a = x;
		b = y;
		}
};

ostream& operator<<(ostream &strm, const Pair &p) {
		return strm << "Pair(" << p.a <<", "<<p.b<<")";
}

bool is_prime(uns_long n){
	if ( n == 2 || n == 3) return true;
	if ((n % 2 == 0) || (n % 3 == 0)) return false;
	uns_long k = 1;
	uns_long limit = (uns_long) sqrt(n);
	while (6 * k - 1 <= limit || 6 * k + 1 <= limit) {
		if (n % (6 * k - 1) == 0 || n % (6 * k + 1) == 0) return false;
		k += 1;
	}
	return true;
}

bool is_even(uns_long a){
	return a % 2 == 0;}

uns_long left_prime(uns_long n){
	if (is_even(n)){ 
		n -= 1;
		for (uns_long i = n;; i -= 2) {
			if (is_prime(i))
				return i;
		}
	}
	else {
		for (uns_long i = n;; i -= 2) {
			if (is_prime(i))
				return i;
		}
	}
}

uns_long righ_prime(uns_long n){
	if (is_even(n)){ 
		n += 1;
		for (uns_long i = n;; i += 2) {
			if (is_prime(i))
				return i;
		}
	}
	else {
		for (uns_long i = n;; i += 2) {
			if (is_prime(i))
				return i;
		}
	}
}


Pair  prime_suroundings(uns_long a){
	// If a is prime returns Pair(0, 0)
	// a > 1
	if (is_prime(a)) 
		return Pair(0, 0);
	else{
		return Pair(left_prime(a), righ_prime(a));
	} 
}

int main(){
	cout << prime_suroundings(134)<< endl; // -> Pair(131, 137)
	cout << prime_suroundings(30)<< endl;  // -> Pair(29, 31) 
	cout << prime_suroundings(137)<< endl;  // -> Pair(0, 0) 
	return 0;	
}

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