Kezdőoldal » Számítástechnika » Programozás » Miért nem jó ez a program...

Miért nem jó ez a program free pascalban? (pi számoló)

Figyelt kérdés

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


2010. aug. 14. 23:41
1 2
 1/15 anonim ***** válasza:
Előszöris nincsenek pi számok... van egy Pi érték, aminek teljesen más a számítási algoritmusa (Pi=3.141592654...)
2010. aug. 15. 00:59
Hasznos számodra ez a válasz?
 2/15 anonim ***** válasza:

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

2010. aug. 15. 01:09
Hasznos számodra ez a válasz?
 3/15 anonim ***** válasza:

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;

2010. aug. 15. 10:14
Hasznos számodra ez a válasz?
 4/15 A kérdező kommentje:
igen xD prím számra gondoltam. bocsánat csak már fáradt voltam.
2010. aug. 15. 14:18
 5/15 A kérdező kommentje:

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?

2010. aug. 15. 14:23
 6/15 anonim ***** válasza:

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

2010. aug. 15. 15:27
Hasznos számodra ez a válasz?
 7/15 A kérdező kommentje:
köszi a válaszod. leírnád hogy te hogy csinálnád? mert igazad van mert megcsináltam 10000-ig és ott már lassú volt.
2010. aug. 15. 18:06
 8/15 A kérdező kommentje:

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.

2010. aug. 15. 20:27
 9/15 anonim ***** válasza:

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.

2010. aug. 15. 20:34
Hasznos számodra ez a válasz?
 10/15 anonim ***** válasza:
Egyébként nekem nagy (százmilliós) számoknál a négyzetgyök keresése nagyon lelassította, kisebbeknél pedig nem nagyon lehetett észrevenni.
2010. aug. 15. 21:57
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!