Programozás tantárgyból lenne szükségem segítségre (Pascal). A feladat : döntsük el egy számról, hogy prím-e! Hogyan oldanátok meg? (Kiegészítések lent)
A program az eldöntés tételéhez tartozik, while ciklussal kéne megoldani, de valahogy nem látom át, hogy kéne működnie.
Gondolatmenetem: Addig növeljük az i értékét, amíg n szám osztva i-vel 0 maradékot eredményez (mod)
ha az i kisebb mint n szám, akkor van maradék, tehát nem osztható minden n-nél kisebb számmal maradék nélkül.
Ez szinte biztos hogy részben rossz.
Igény esetén forráskód részletet felrakok.
Minden segítséget előre köszönök!
Szia.
Az ossztási ciklust elég az N szám gyökéig futtatni csak (Rosszabb esetben a szám feléig).
Másold a forráskód azon részét ami rossz szerinted és meglátjuk mit tudunk összehozni. (igy maximum csak saját magunk által megirt kóddal tudnánk segiteni)
Üdv.
Elég a szám gyökéig vizygálnod.
Viszont egy sokkal jobb megoldás: eratoszthenész szitája.
Köszönöm a segítségeket eddig, amíg a gyökös dologgal próbálkozom, felrakom a jelen forráskódot:
_______________________________________
program eldontes3;
uses wincrt;
const n=5;
var a,s,i: integer;
r: real;
begin
writeln('Ez a program eldonti egy számrol, hogy prímszám-e');
write(' kérem a számot: ');
readln(a);
i:=1;
while (a mod i<>0) and (i<=a) do
begin
inc(i);
end;
if (i<a) and (i<0) then writeln('nem')
else writeln('prímszám');
end.
_____________________________________
Vannak nem használt változók, mert a keretet másik programból szedtem át. Ezek már csak próbálkozások voltak.
Szia.
Akkor nézzük, hogyan határozod meg azt, hogy a szám prim-e :
Elkezdi az ember a számot elosztani 2-vel, 3-mal, 5-tel, 7-tel, stb, stb. és ha szám nem osztható, akkor prim.
Tehát magyarul a szám osztóit kell nyilvántartani, és ha ez az érték 0 akkor a szám prim, elenkező esetben nem prim.
1. Vedd fel a osztás számlálót és addj neki kezdőértéket. (ez a változó lehet boolean tipusu is mivel ha a számnak már egy osztója van akkor nem prim)
2. Határozd meg a szám gyökét vagy felét. (ciklus vége)
3. Inditsd a ciklust de ne 1-ről, hanem eleve 2-ről a a 2.pontban meghatározott számig. A ciklus feltétele ha a szám osztóinak darab száma 0 (1. pontban felvett változó) és a ciklusszámláló kisebb egyenlő a 2. pontban meghatározott számnál.
A ciklusban végezd el a mod-os osztást és ha osztható akkor növeld az 1. pontban felvett változót (ami miatt ki is fog lépni a ciklusból - egy egyszerű if).
(Ha az 1. pontban boolean változótt vettel fel akkor itt if helyett csak egy egyszerű értékadás)
Kilépés után vizsgáld az 1. pontban felvett változót és annak alapján határozd meg azt, hogy prim-e. (0 vagy nem, igaz vagy hamis)
Sok sikert.
Üdv.
Csak hogy én is beleugassak :)
function prim_e(const n: Integer) : boolean;
var i: Integer;
begin
prim_e:= True;
for i:= 2 to Round(Sqrt(n)) do
if (n mod i) = 0 then prim_e:= False
end;
Üdv.
Nem rossz, csak nem hatékony.
Mivel ha n értéke egy viszonylag nagy szám, és még ráadásul páros is akkor elvégzi az összes osztást a szám gyökéig, pedig nem kellene neki csak egy osztást elvégezni - a 2-vel való osztást - és aztán kilépnie.
üdv.
Igazságod van :)
function prim_e(const n: Integer) : boolean;
var i: Integer;
begin
prim_e:= True;
if Odd(n) = False then
begin
for i:= 2 to Round(Sqrt(n)) do
if (n mod i) = 0 then prim_e:= False;
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!