Zadanie z liczbami pierwszymi

Zadanie z liczbami pierwszymi
SO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:27
0

Prosze serdecznie o pomoc z nastepujacym zadaniem:
Treść: Dana liczba naturalna n. Napisać program znajdujący najbliższą jej liczbę pierwszą(lub dwie takie liczby).
Znalazlem algorytm na wypisanie liczb pierwszych, ale nie wiem co zrobic dalej, zeby program wypisywal po podaniu liczby jej najblizszą pierwszą.
Oto co juz mam:

Kopiuj
int main () 
{
    for (int i=2; i<1000000; i++) 
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
                break;
            else if (j+1 > sqrt(i)) {
                cout << i << " ";
            }
        }   

    return 0;
}
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
0

Wydziel sprawdzanie pierwszości do osobnej funkcji, a potem szukaj liczb oddalonych o kolejne odległości, aż napotkasz taką parę, gdzie co najmniej jedna będzie pierwsza. Pytanie co zrobić jak sama podana liczba będzie pierwsza?


enedil
Ja bym powiedział, że jeśli p jest pierwsza, to najbliższa jej liczba pierwsza, to p.
SO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:27
0

OK mam warunek czy wpisana przypadkowo nie jest pierwsza, ale co dalej?

Kopiuj
#include<cstdlib>
using namespace std;

bool czy_pierwsza(int n)
{
	if(n<2)
		return false; //gdy liczba jest mniejsza niż 2 to nie jest pierwszą		
	for(int i=2;i*i<=n;i++)
		if(n%i==0)
			return false; //gdy znajdziemy dzielnik, to dana liczba nie jest pierwsza
	return true;
}

int main () 
{
int n;
	
cout<<"Podaj liczbę: ";
cin>>n;

if (czy_pierwsza(n)==true)
	cout<<"To liczba pierwsza!"<<endl;
else	//jesli nie to cos robimy...
   {
	for (int i=2; i<1000000; i++) 
       		for (int j=2; j*j<=i; j++)
        	{
            		if (i % j == 0) 
                		break;
            		else if (j+1 > sqrt(i))
                		cout << i << " ";
            	}
    }   

    return 0;
}
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4930
0

Zwraca pierwszą pierwszą:), można zastosować funkcję kilka razy.

Kopiuj
#include <iostream>

int prime_test(int n){
	if (n <= 3) return n > 1;
	else if ( (n % 2 == 0) || (n % 3 == 0) ) return 0;
	int i = 5;
	while ( i * i <= n){
		if ( (n % i == 0) || ( n % (i + 2) == 0) )
			return 0;
		i += 6;
	}
	return 1;
}

int nextPrime(int n) {
	int num{0};
	if (n % 2 == 0) num = n + 1;
	else num = n;
	for (int i = num;;i += 2)
		if (prime_test(num)) return num;
}

int main() {
	std::cout << nextPrime(100) << "\n"; // -> 101
	std::cout << nextPrime(100002) << "\n"; // -> 100003
	return 0;
}

SO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:27
0

hmm, a gdzie tu jakis cin zeby wprowadzic liczbe? Nie rozumiem jak to ma dzialac:/ Wytłumaczysz?pls
Przebudowalem troche Twoj kod, ale podaje on bledne wyniki, lub wcale ich nie podaje np. dla liczby 90, 200, 300 nie dziala... i wg rzadko kiedy działa.. Pomoze ktos?

Kopiuj
int main() {
    std::cout<<"Podaj liczbe: ";
    std::cin>>liczba;
    std::cout<<std::endl<<"Najblizsza liczba pierwsza: "<<nextPrime(liczba);
    //std::cout << nextPrime(100) << "\n"; // -> 101
    //std::cout << nextPrime(100002) << "\n"; // -> 100003
    return 0;
}
edytowany 1x, ostatnio: Spark_of_hope
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4930
0

Mozesz sobie dodac czytanie:

Kopiuj
   int n{0};
	std::cin>>n;
	std::cout << "\n";
	std::cout << nextPrime(n) << "\n";

W sumie, mam jeszcze pytanie, czy to ma być najbliższa następna, czy najbliższa, w sensie odległości(najbliższa mniejsza lub większa)?


edytowany 1x, ostatnio: lion137
SO
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:27
0

W sumie, mam jeszcze pytanie, czy to ma być najbliższa następna, czy najbliższa, w sensie odległości(najbliższa mniejsza lub większa)?

Najbliższa w sensie odleglosci, mniejsza lub wieksza zalezy ktora lezy blizej, lub dwie gdy odleglosc bezwzgledna jest taka sama:/

edytowany 2x, ostatnio: Spark_of_hope
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4930
1

Trochę zmieniłem, zwraca, std::vector:

Kopiuj
#include <iostream>
#include <vector>

int prime_test(int n){
	if (n <= 3) return n > 1;
	else if ( (n % 2 == 0) || (n % 3 == 0) ) return 0;
	int i = 5;
	while ( i * i <= n){
		if ( (n % i == 0) || ( n % (i + 2) == 0) )
			return 0;
		i += 6;
	}
	return 1;
}

std::vector<int> nextPrime(int n) {
	std::vector<int> out;
	if (prime_test(n)) {
		out.push_back(n);
		return out;
	}
	for (int i = n, k = n;;i++, k--){
		if (prime_test(i) && prime_test(k)) {
			out.push_back(i);
			out.push_back(k);
			return out;
		}
		if (prime_test(i)) {
			out.push_back(i);
			return out;
		}
		if (prime_test(k)) {
			out.push_back(k);
			return out;
		}
	}
}

void printVec(std::vector<int> a) {
	for (auto & e : a)
		std::cout << e << " ";
	std::cout << "\n";
}

int main() {
	int k;
	std::cin>>k; // -> 42 (100) (48)
	std::cout << "\n";
	std::vector<int> a = nextPrime(k);
	printVec(a); // -> 43, 41 (101) (47)
	return 0;
}

SO
Dzięki piękne:) Nie znam vectorów w c++, no ale naucze sie kodu na pamięć i może obronie, że sam napisałem:D Jesszcze raaz dzieeeki!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.