Zadanie z liczbami pierwszymi

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:

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;
}
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?

0

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

#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;
}
0

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

#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;
}
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?

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;
}
0

Mozesz sobie dodac czytanie:

   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)?

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

1

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

#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;
}

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