• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie programowanie c++ liczby pierwsze

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
532 wizyt
pytanie zadane 14 września 2022 w C i C++ przez fsfxvcxv Obywatel (1,160 p.)

Treść zadania: Napisz program, za pomocą którego otrzymasz tylko te liczby z pliku liczby.txt, które są kwadratami liczb pierwszych.

Nie potrafię znaleźć błędu przez który wynik jest totalnie nieprawidłowy.

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

bool czy_pierwsza(int liczba)
{
	if(liczba<2)
	return false;
	
	for(int i=2;i<sqrt(liczba);i++)
	{
		if(liczba%i==0)
		return false;
	}	
	return true; 
}


int main(int argc, char** argv) {
	
	ifstream infile("liczby.txt");
	int liczba;
	int liczba2;
	for(int i=0;i<500;i++)
	{
		infile >> liczba;
		liczba2=sqrt(liczba);
		
		if(czy_pierwsza(liczba2))
		{
			cout<<liczba<<endl;
		}		
	}
	
	
	return 0;
}

 

komentarz 14 września 2022 przez Velta Maniak (52,790 p.)
Czemu limitem w zakresie fora jest pierwiastek z liczby wejściowej? Liczba pierwsza to taka, która dzieli się wyłącznie przez 1 i samą siebie.
komentarz 14 września 2022 przez fsfxvcxv Obywatel (1,160 p.)
ponieważ pierwiastek z tej liczby to ostatnia liczba, która może być dzielnikiem liczby.

Patrzyłem to z algorytmem na liczby pierwsze nie ma problemu tylko gdzies dalej.
komentarz 14 września 2022 przez Whistleroosh Maniak (57,360 p.)
Zobacz co zwróci czy_pierwsza(25)
1
komentarz 14 września 2022 przez Oscar Nałogowiec (29,340 p.)
edycja 14 września 2022 przez Oscar
Pomysł z pierwiastkiem jest ok, ale pierwiastek też może być podzielnikiem, czyli nierówność powinna być nieostra.

Mam wątpliwości co do tego dalszego pierwiastkowania - sprawdzenia czy pierwiastek z liczby jest liczbą pierwszą. Pamiętaj, że używasz liczb całkowitych, a pierwiastek z liczby całkowitej zwykle nie jest całkowity. Masz tam przybliżenie.

1 odpowiedź

0 głosów
odpowiedź 14 września 2022 przez tmar1212 Bywalec (2,600 p.)

Tak jak powyżej, nierównośc w funkcji sprawdzającej pierwszość musi być nieostra; a drugi bug jest w main: musisz sprawdzić czy liczba jest perfect square.

#include <iostream>
#include <fstream>
#include <cmath>


using namespace std;


bool czy_pierwsza(int liczba)
{
    if(liczba<2)
        return false;
     
    for(int i = 2;i <= sqrt(liczba);i++)
    {
        if(liczba % i == 0)
        return false;
    }   
    return true; 
}
 
 
int main(int argc, char** argv) {
     
    ifstream infile("liczby.txt");
    int liczba;
    for(int i = 0 ;i < 500;i++)
    {
        infile >> liczba;
        if (ceil((double)sqrt(liczba)) == floor((double)sqrt(liczba)))
        {
            if(czy_pierwsza(ceil((double)sqrt(liczba))))
            {
                cout<<liczba<<endl;
            }       
        }
    }
    return 0;
}

https://www.geeksforgeeks.org/check-if-given-number-is-perfect-square-in-cpp/

https://en.wikipedia.org/wiki/Square_number

Podobne pytania

0 głosów
2 odpowiedzi 700 wizyt
pytanie zadane 1 lipca 2018 w SPOJ przez Fernokip Nowicjusz (180 p.)
0 głosów
1 odpowiedź 2,543 wizyt
0 głosów
1 odpowiedź 1,349 wizyt

93,103 zapytań

142,077 odpowiedzi

321,562 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...