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
Én vagyok akitől kérdezted, hogy hogy csinálnám.
De igazából én vagyok a 3. válaszoló is, úgyhogy már leírtam. :)
1000-ig kevés szám van (már a számítógépnek), így elég az is, de százmilliós vagy tízmilliós számokra inkább Erisztotenész szitája.
Az ötlete a következő: Tudjuk, hogy egy prímszám egész osztói csakis az 1 és önmaga.
Veszel egy vektort (egy dimenziós tömböt, tényleg tanultál már olyat?), amiben azt tárolod, hogy egy szám prím-e vagy sem. Az egyest bejelölöd, hogy nem prím, mivel nem az... :P
Ezután ezt csinálod: keresed a következő prím számot, ami mindig nagyobb mint az előző szám amit néztél (az elején az 1nél nagyobb), és a vektorban az értéke igaz, vagyis prím szám. Ez után veszed a prím szám összes többszörösét, és a vektorban bejelölöd őket, mint nem prímek. (Mivel oszthatók legalább 3 számmal: önmagukkal, 1-el, és az előbb megtalált prím számmal) Ezt addig csinálod, amíg a többszörös nagyobb vagy egyenlő lesz a maximum számmal ameddig mész. Ez után újrakezded, és veszed a következő prím számot. :) Addig csinálod, míg a prím szám négyzete nagyobb vagy egyenlő lesz a maximumnál ameddig keresed a prímeket.
Itt van egy jó link ami ezt magyarázza:
még egy kicsit javítottam rajta :
program primszam;
uses crt;
var d,e,h,i,f:integer;
begin
clrscr;
for i:=1 to 1000 do begin
e:=0;
for d:=1 to 1000 do begin
for h:=1 to i do begin
if i/d=h then begin
e:=e+1;
end;
end;
end;
if e=2 then
writeln(i);
end;
readln;
end.
így jóval gyorsabb! köszönöm a válaszokat azon a forráskódon pedig majd gondolkodom.
A te módszered írtó lassú, és nem kell ide semmi erisztotenész csak ész:
var n,i,g,j:integer;
begin
for i:=1 to 1000 do
begin
g:=0;
for j:=1 to i do
if i mod j=0 then
inc(g);
if g=2 then
write(i,' ');
end;
end.
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!