Esercizio con true false

Stato
Discussione chiusa ad ulteriori risposte.

MPG

Utente Attivo
544
4
Dato un parametro intero, la funzione restituisce true se esso è primo, false altrimenti.
Cosa ne pensate?

Codice:
#include <iostream>

using namespace std;
bool flag= true;
int verificaPrimo(int n)

{

if(n%2!=0)
{
return flag;
}
else
{
flag = false;
return flag;
}

}

int main()
{
int numero;
cin>>numero;
verificaPrimo(numero);
cout<<flag;



    return 0;

}
 

Tidus88

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
Direi che questa parte:


Codice:
if(n%2!=0)
{
    return flag;
}

Non corrisponde correttamente al concetto di n. primo.

Es: 9 non è un numero primo, eppure il tuo programma direbbe di sì, poichè la divisione per 2 darebbe resto diverso da 0.

Secondo me l'unico modo che hai per verificare se un numero è primo è quello di eseguire un ciclo for con i che va da 2 ad n-1 e verificare se n%i da sempre resto != 0.
Prima però sarà il caso di verificare che n sia > 2 (altrimenti è necessariamente primo)

Mi viene da pensare (ma è un'idea che non ho verificato e che probabilmente è matematicamente errata) che il tuo ciclo potrebbe anche andare da 2 ad n/2
 

MPG

Utente Attivo
544
4
Ho letto di uso della sqrt per il numero primo tipo
int radice=sqrt(n);
pero' non so bene usarla in questo caso...
 
Ultima modifica:

Tidus88

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
Sì, ho letto anche io.
Il ciclo For dovrebbe andare da 2 a ceiling( sqrt(n) ) (ovvero la radice di n arrotondata per eccesso)

Esistono poi moltissimi altri metodi matematici più sofisticati, diciamo che questo che stiamo tentando è molto tendente al brute force :D
 

dgcross

Utente Attivo
1,279
342
CPU
Ryzen 5 5600X
Dissipatore
EK Supremacy EVO (2x Alphacool NexXxoS ST30 360mm)
Scheda Madre
ASRock X370 Gaming K4
HDD
Samsung 980 Pro 512GB, Samsung 870 EVO 2TB, Goodram CX300 480GB, Toshiba P300 3TB
RAM
2x8+2x16 G.Skill TridentZ RGB @3400MHz CL16
GPU
Galax 2080 Ti HOF OC Lab + liquido custom (2x Alphacool NexXxoS ST30 360mm)
Audio
Alientek D8, Fiio Q1 Mark II, Mission LX-1, Sennheiser HD598 SE
Monitor
Samsung U28E590D
PSU
Corsair AX860i
Case
Lian Li O11 Dynamic
Periferiche
Ozone Strike Pro Spectra, Steelseries Rival 500, DualSense
Net
Tiscali
OS
Windows 10 Pro
in realtà basta radice n arrotondata per difetto :)
 

Mursey

Super Moderatore
Staff Forum
Utente Èlite
8,230
5,659
flag dichiarato all'esterno di verificaPrimo non si può vedere però :nono:
fai un vero ritorno di funzione
 
  • Mi piace
Reazioni: Tidus88

MPG

Utente Attivo
544
4
A dir la verità ho trovato qualcosa tipo questo:

Codice:
bool verificaPrimalita(int n)
{
   int radice=sqrt(n);
   int div=2;

   while(div<=radice)
   {
       if(n%div==0)
        return false;
     div++;
   }
   return true;
}
ma non riesco bene a capire.. aiuti sempre bene accetti ....
 

dgcross

Utente Attivo
1,279
342
CPU
Ryzen 5 5600X
Dissipatore
EK Supremacy EVO (2x Alphacool NexXxoS ST30 360mm)
Scheda Madre
ASRock X370 Gaming K4
HDD
Samsung 980 Pro 512GB, Samsung 870 EVO 2TB, Goodram CX300 480GB, Toshiba P300 3TB
RAM
2x8+2x16 G.Skill TridentZ RGB @3400MHz CL16
GPU
Galax 2080 Ti HOF OC Lab + liquido custom (2x Alphacool NexXxoS ST30 360mm)
Audio
Alientek D8, Fiio Q1 Mark II, Mission LX-1, Sennheiser HD598 SE
Monitor
Samsung U28E590D
PSU
Corsair AX860i
Case
Lian Li O11 Dynamic
Periferiche
Ozone Strike Pro Spectra, Steelseries Rival 500, DualSense
Net
Tiscali
OS
Windows 10 Pro
sì che poi è proprio brute force... una volta verificato che non è divisibile per 2 puoi banalmente controllare solo per i divisori dispari dimezzando il tempo che ci impiega a fare il ciclo while...

A dir la verità ho trovato qualcosa tipo questo:

Codice:
bool verificaPrimalita(int n)
{
   int radice=sqrt(n);
   int div=2;

   while(div<=radice)
   {
       if(n%div==0)
        return false;
     div++;
   }
   return true;
}
ma non riesco bene a capire.. aiuti sempre bene accetti ....

inizializza il divisore a 2, poi inizia a ciclare controllando se è divisibile per il divisore: se sì ti ritorna falso, se no incrementa divisore di 1 e ricontrolla.
se a fine ciclo non ha mai trovato un divisore ritorna vero
 

Tidus88

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
Beh, è un po' come fare il for che dicevamo prima.

Lui parte da 2, per ogni valore di div prova a vedere se il resto della divisione con n è == 0.
Se questo si verifica evidentemente il numero non è primo, quindi ritorna direttamente false.
Altrimenti incrementa di 1 div e ripete l'iterazione fino a che div non sia > di radice (sqrt(n)).

Se termina tutte le iterazioni senza che sia mai verificata la condizione n%div == 0 allora esce dal while e a quel punto ritorna true.
 

MPG

Utente Attivo
544
4
Quindi cosi' va bene?
Ma non riesco a capire pero' sempre si usa sqrt(n) ......


Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

bool verificaPrimalita(int n)
{
   int radice=sqrt(n);
   int div=2;

   while(div<=radice)
   {
       if(n%div==0)
        return false;
     div++;
   }
   return true;
}

int main ()
    {
    int n;
    cin>>n;
    cout<<verificaPrimalita(n)<<endl;
    return 0;
}
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Direi che questa parte:


Codice:
if(n%2!=0)
{
return flag;
}

Non corrisponde correttamente al concetto di n. primo.

Es: 9 non è un numero primo, eppure il tuo programma direbbe di sì, poichè la divisione per 2 darebbe resto diverso da 0.

Secondo me l'unico modo che hai per verificare se un numero è primo è quello di eseguire un ciclo for con i che va da 2 ad n-1 e verificare se n%i da sempre resto != 0.
Prima però sarà il caso di verificare che n sia > 2 (altrimenti è necessariamente primo)

Mi viene da pensare (ma è un'idea che non ho verificato e che probabilmente è matematicamente errata) che il tuo ciclo potrebbe anche andare da 2 ad n/2
9 non è un numero primo

In ogni caso, meglio che studiate un po' di matematica oltre a tentare di programmare queste cose banali: mai sentito parlare del "crivello di Eratostene"?

Magari trovare i numeri primi fosse così semplice.. o anche no, visto che su questi si basano i sistemi di crittografia. Un numero primo è un intero divisibile solo per 1 e per sé stesso.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
  • Mi piace
Reazioni: dgcross

MPG

Utente Attivo
544
4
9 non è un numero primo

In ogni caso, meglio che studiate un po' di matematica oltre a tentare di programmare queste cose banali: mai sentito parlare del "crivello di Eratostene"?

Inviato dal mio Nexus 5 utilizzando Tapatalk

So cos'è il numero primo ci mancherebbe.. poi è tutto banale per chi ha dimestichezza nella materia (oltre che arrivarci prima non tutti siamo uguali...).
Comunque è un po' esagerato permettimi di dare quasi dell'ignorante a chi chiede aiuto....
Se so so benissimo l'inglese e tu chiedessi sul forum delle domande in merito all'inglese non ti risponderei "meglio che studi" ma cerco di aiutarti anche se per me la domanda è banale...
 
Ultima modifica:

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
La radice quadrata non serve a niente. Per verificare che un numero sia primo e quindi assegnare la variabile non serve dividere il numero per tutti i numeri precedenti, ma puoi evitare la divisione per i multipli, basta verificare la divisione senza resto solo per i numeri primi precedenti.
Tieni presente che, a parte 1, anche 2 e 3 sono numeri primi!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

MPG

Utente Attivo
544
4
La radice quadrata non serve a niente. Per verificare che un numero sia primo e quindi assegnare la variabile non serve dividere il numero per tutti i numeri precedenti, ma puoi evitare la divisione per i multipli, basta verificare la divisione senza resto solo per i numeri primi precedenti.
Tieni presente che, a parte 1, anche 2 e 3 sono numeri primi!

Inviato dal mio Nexus 5 utilizzando Tapatalk

Per la verità questo
int radice=sqrt(n)

l'ho visto nel programma del professore di informatica.....
 
Ultima modifica:

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Per la verità questo
int radice=sqrt(n)

l'ho visto in un programma del professore di informatica.....
Quindi? Metti dentro cose a caso perché le vedi qua o là? La radice ti può servire per fare la fattorializzazione (trovare il minimo comune multiplo: algebra di seconda media!). Ma non basta che la radice sia intera.. per esempio 81 dà 9 ed entrambi non sono numeri primi.. oppure 100!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili