» »

[C++] Program za iskanje praštevila

[C++] Program za iskanje praštevila

mindzone ::

Pozdravljeni.

S pomočjo while zanke sem poskušal napisati program, ki bi preveril, ali je vneseno praštevilo res praštevilo ali ne. Program deluje vse lepo za cca. prvih 50 števil, naprej pa več ne.

Je kdo tako prijazen, da mi pove kje je napaka? Najlepša hvala.

http://prntscr.com/29nlh0

drola ::

Številke v spremenljivki c postanejo izredno visoke. Zgodi se ti integer overflow.

Preoblikuj algoritem.
https://drola.si

mindzone ::

V glavnem ideja je pravilna? Ker nisem ravno najbolj prepričan, da razumem delovanje te while zanke.

tx-z ::

Napiš si kaj se zgodi če je n=1, če je n=2, n=3 ....za ene par cifr, pa ti bo mogoče potem malo bolj jasno :)
tx-z

black ice ::

Zakaj v C++ uporabljaš C-jevske funkcije?

mihy11 ::

black ice je izjavil:

Zakaj v C++ uporabljaš C-jevske funkcije?


Kakor vem, je za vpis pri c++ cout...;)

black ice ::

Cout je izpis (standard output stream), cin je vpis (standard input stream).

mindzone ::

V šoli delamo v C. Kolikor vem C komande delujejo v C++. To ni problem.

drola ::

Tvoj algoritem gre čez vsa števila manjša od vnesenega. V spremenljivko c dobiš zmnožek ostankov pri deljenju vnesenega števila z zaporednimi manjšimi števili.

Za 7:
c = 1*1*3*2*1; //dobiš število različno od 0

Če imaš število, ki ni praštevilo, se zgodi nekaj takega:
Za 6:
c = 0 * 0 * 2 * 1; //dobiš 0, ker je en (ali več) ostankov 0

Ampak če preverjaš za malo večje število, dobiš v spremenljivki c neko zelo zelo veliko število. Tako zelo veliko, da ga ne moreš več spravit v 32 bitov, kolikor prostora zavzema podatkovni tip int, zato se programu zmeša. Torej ideja je pravilna z matematičnega stališča, s praktičnega (delaš na računalniku, ki ne more hraniti poljubno velikih števil) pa ne.

Boljši pristop je, da namesto množenja ugotoviš, ali so bili vsi ostanki različni od nič, na kak drug način. Pred štartom while zanke lahko neko spremenljivko postaviš na true. Če naletiš na ničeln ostanek, jo nastaviš na false. Če je po izvedbi while zanke spremenljivka še vedno true, imaš praštevilo, v nasprotnem primeru pa ne.
https://drola.si

black ice ::

En zelo enostaven način, kako rešiti: preverjaš število deljiteljev poljubnega števila. Torej, če ima število več kot 2 (1 in samega sebe) ni praštevilo.

Hiter in mogoče malo težji način je Eratostenovo sito. Na forumu je ogromno podobnih tem, naj te ne bo strah pobrskati. Še en hint: iskalnik na Slo-techu je zanič, uporabi Google s parametrom site:slo-tech.com.

JanK ::

Dve preprosti spremembi, pa bo delal tudi tale algoritem.

14: bool c = true;
Efekt je isti, kot ce vzames integerje: cim je eno stevilo deljitelj, bo c postal false, drugace pa ne. Ne bos pa prisel do integer overflowa.
17: while(c && k*k<n){
Ko enkrat najdes deljitelja, nima smisla nadaljevati, ker ves, da ni prastevilo. Dalj od korena stevila pa tudi nima smisla iskati, kajti, ce do tam ni bilo deljitelja, ga tudi kasneje ne bos nasel.
"Think about how stupid the average person is,
then realize that 50% are stupider than that"
-George Carlin

Zgodovina sprememb…

  • spremenil: JanK ()

Yacked2 ::

Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

mindzone ::

Hvala vsem za odgovore, sem že predvčeraj pogruntal, da namesto z množenjem enostavno pristopim s seštevanjem. Torej če definiram pred zanko vsoto int vsota = 0, v zanki pa enostavno napišem pogoj, torej če je ostanek pri deljenju danega števila enak 0 -> s=s+1.

Izven zanke sem nato dodal pogojni stavek, torej če je s>0, potem dano število ni praštevilo, else Je praštevilo.

Nisem se zavedal tega integer overflowa, ker je program iz matematičnega vidika bil korekten.

Tak da @drola hvala, da mi nisi takoj izdal rešitve, s tem da sem sam popravil program sem več odnesel kot sicer.

Lp


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

NUJNO!Algoritmi C++

Oddelek: Pomoč in nasveti
211937 (1199) DOOM_er
»

pra števila.. (strani: 1 2 )

Oddelek: Znanost in tehnologija
788689 (5028) Yacked2
»

Pomoc programiranje - Napisite funkcije

Oddelek: Programiranje
102011 (1600) FuI2cY
»

Najhitrejši programski jezik? (strani: 1 2 )

Oddelek: Programiranje
757649 (5469) Senitel
»

Problemi pri C++ programiranju...

Oddelek: Programiranje
363875 (3350) George

Več podobnih tem