Miért nem jó ez a program free pascalban? (pi számoló)
program primszam;
uses crt;
var d,e,h,i:integer;
begin
clrscr;
for i:=1 to 1000 do begin
e:=0;
for d:=1 to 1000 do begin
for h:=1 to 1000 do begin
if i/d=h then begin
e:=e+1;
if e=2 then
writeln(i);
end;
end;
end;
end;
readln;
end.
ne azt írjátok le hogy hogy lehet másképp megoldani hanem hogy lehet a legkevesebb változtatással helyessé tenni ezt a kódot hogy a pí számokat keresse 1-től 1000ig
Jahogy prím :)
Az "if e=2" vizsgálatot az i-s ciklusba, a d és h ciklusán kívülre tedd (readln előtti end; elé).
Esetleg hibát írhat az i/d=h vizsgálatra a típusok eltérése (i/d->real, h->integer) miatt. Ilyenkor (real)h-t írj (típuskényszerítésnek hívják).
Igy akarsz prím számokat vizsgálni? Elég frucsa és lassú is...
A programozásnak nem az a lényege, hogy hagyod szenvedni a gépet egy ilyen megoldással, hanem az, hogy minél gyorsabb megoldás legyen. Gondolom te is szidnád a Windows programozóit, ha a start menü fél percbe telne míg bejönne egy hasonló algoritmus miatt...
A prím számokat leggyorsabban Erisztotenész szitájával keresheted, de egy számról eldöntheted, hogy prím-e, úgy, ha a szám feléig vizsgálod a számokat, és ha az egyikkel is osztható, akkor már nem prím. Még gyorsabb, ha csak a gyökéig nézed őket, és helyes is.
pl.
function prim( x:longint ):boolean;
var i:longint;
begin
prim := true;
for i:=2 to sqrt(x) do // az sqrt(x) az x gyoket jelenti
if x mod i = 0 then (ha a szam oszthato egy szammal, ami a gyokenel kisebb vagy egyenlo akkor:)
begin
prim := false; ( biztosan nem prim szam)
exit; (kilepunk az eljarasbol, hogy mar ne vizsgaljuk a tobbi szamra, mivel mar biztosan tudjuk, hogy nem prim szam)
end;
end;
ez így jó :
program primszam;
uses crt;
var d,e,h,i:integer;
begin
clrscr;
for i:=1 to 1000 do begin
e:=0;
for d:=1 to 1000 do begin
for h:=1 to 1000 do begin
if i/d=h then begin
e:=e+1;
end;
end;
end;
if e=2 then
writeln(i);
end;
readln;
end.
Köszönöm a segítséget! esetleg vki megmagyarázza miért nem volt jo hogy a h ciklusban volt?
if i/d=h nekem ez nem tetszett.
Mindhárom szám megy 1000ig, így ez a következőket fogja vizsgálni:
1/1=1 ?
1/1=2 ?
1/1=3 ?
1/1=4 ?
.....
1/1=1000 ?
1/2=1 ?
1/3=2 ?
.....
1/3=1000 ?
.....
1/1000=1 ?
1/1000=2 ?
....
1/1000=1000 ?
és ezt az összes számra 1000ig....
Ez rengeteg számolás, szám növelés meg minden, és semmi értelme nincs, mivel egyszerűen megvizsgálhatod az oszthatóságot a következővel: if i mod d = 0 then ...
...
Na mindegy... Szerintem, ha nem akarod megfogadni az előző tanácsom, és egy kicsit javítani rajta, akkor ne akarj programozni. Bocs, hogy ezt mondom, de valakinek meg kell mondja...
Azért nem volt jó, hogy a ciklusban volt, mert minden számot többször is kiírhatott... pl. a kettőt:
2/1 = 2 Itt növeli az e-t, innen a ciklzus további részén e=1
És egyből nézte is, hogy egyenlő-e kettővel... most még nem...
Utána:
2/2 = 1 itt növeli megint az e-t, ami már 2 lesz. És ki is írja azt.
A következő számolás ez lesz: 2/2 = 2 Ez nem igaz, ezért a program nem növeli az e-t, de kiírja a 2-t, mivel az e az előbbi után még mindig kettő maradt...
De a prím számokat így is észreveheted, mindegyik prim szám, amit legalább 2szer kiír. De a nem prímeket is kiírja, azokat csak 1szer. (az 1 kivételével.)
1 icipicit javítottam rajta hogy gyorsabb legyen :
program primszam;
uses crt;
var d,e,h,i,f:integer;
begin
clrscr;
for i:=1 to 1000 do begin
f:=i*2;
e:=0;
if i=501 then
f:=1000;
for d:=1 to 1000 do begin
for h:=1 to f do begin
if i/d=h then begin
e:=e+1;
end;
end;
end;
if e=2 then
writeln(i);
end;
readln;
end.
Számolásnak valóban sok.
Általában úgy szokás prímet keresni, ahogy a 3. válaszoló írta. Hogy 2-től a szám négyzetgyökéig kell megvizsgálni, hogy van-e osztója, mert ha van, akkor nem prímszám, de az 1 és a 2 az prímszám, tehát 3-tól 1000-ig megy a ciklus.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!