Prím tényezős felbontás Pascalban?
Össze kéne dobnom egy programot ami a bekért számot felbontja prím szorzatokra. Még anno sikerült a képernyőre szülnöm egy progit ami megmondja hogy prím-e és gondoltam majd abból megcsinálom ezt is. Az a gond hogy fogalmam sincs hogy hogyan vagy hogy amúgy, a program felhasználása nélkül hogyan csináljam meg.
A progi így néz ki:
program bekeres;
uses crt;
var
a,i:integer;
b: real;
o: boolean;
begin
clrscr;
writeln('Adjon meg egy szamot!');
readln(b);
a:=trunc(b);
o:=true;
for i:=2 to a div 2 do
if a mod i=0
then
o:=false;
if o=true then writeln('prim szam') else writeln('nem prim szam');
readln;
end.
Kezd feltoszni ez a feladat -.-"
Na most miért nem jó? Az első számot kiírja de tovább nem megy -.-"
program felbontas;
uses crt;
var
i,szam:integer;
osztott:boolean;
begin
clrscr;
writeln('Adjon meg egy szamot!');
readln(szam);
repeat
i:=2;
osztott:=false;
repeat
if szam mod i=0
then
begin
write(i,'*');
szam:=szam mod i;
osztott:=true;
end
else
inc(i);
until osztott=true;
until szam<=1;
readln;
end.
Kicsit javítottam de ugyanúgy szar...
program felbontas;
uses crt;
var
i,szam:integer;
osztott:boolean;
begin
clrscr;
writeln('Adjon meg egy szamot!');
readln(szam);
while (szam<>1) and (szam>1) do
begin
i:=2;
osztott:=false;
repeat
if szam mod i=0
then
begin
write(i,'*');
szam:=szam mod i;
osztott:=true;
end
else
inc(i);
until osztott=true;
end;
readln;
end.
"while (szam<>1) and (szam>1) do" Addig ismétli míg szam egytől különböző és szam nagyobb mint 1. A második feltétel telesülésekkor mindig teljesül az első feltétel kivétel nélkül. Ezért az első feltétel elhagyható, ugyan azt csinálja a "while (szam>1) do" ismétlési feltétel, bár ez nem hiba,de felesleges feltételvizsgálatokat kerüljük.
A szam mod i azt jelenti hogy szam-ot elosztva i-vel mennyi osztási maradékot kapunk ...
Hiba : szam:=szam mod i; Mennyi lesz szam? 0 mert akkor hajtódik végre a művelet,ha szam mod i=0 feltétel teljesül. A while ciklus befejeződik mert szam<1 teljesül.
Ha a "szam:=szam mod i" sort kicseréled "szam:=szam div i"-re akkor ez a probléma megoldódik.
Hú de jó most már tökéletes?
Nem.
Akkor ha eltekintünk attól hogy a végén a levegőbe lóg egy * jel?
Akkor sem tökéletes, elméletileg igen gyakorlatilag nem.
Írd be hogy 40000!
Nem ír ki semmit.
Írd be hogy 65546!
Mit ír ki és miért?
Nem a programod logikájában van a hiba. Ezen kívül amit írtam ne javíts ki semmit!
Csak arra vagyok kíváncsi hogy rájössz e hogy mitől van ez.
Ha azt mondod hogy szabad a gazda akkor megmondom a választ és megmutatom hogy én hogy csináltam meg.
Véletlenül nem azért mert az integer maximum értéke csak 32767?
Amúgy köszi a megoldást. Valahogy a legegyszerűbbeken bukok el ~.1
Most így néz ki és a végén se lóg a levegőben a szorzás jel.
program felbontas;
uses crt;
var
i,szam:longint;
osztott:boolean;
begin
clrscr;
writeln('Adjon meg egy egesz szamot!');
readln(szam);
while 1<szam do
begin
i:=2;
osztott:=false;
repeat
if szam mod i=0
then
begin
write(i);
szam:=szam div i;
osztott:=true;
end
else
inc(i);
until osztott=true;
if szam>1 then write('*');
end;
readln;
end.
"Amúgy köszi a megoldást. Valahogy a legegyszerűbbeken bukok el ~.1"
Szívesen. Nagyon észnél kell lenni, ha egy a helyett véletlenül b-t írsz és minden más stimmel bugába dőlhet az egész program.
"Most így néz ki és a végén se lóg a levegőben a szorzás jel."
Oké.
"Véletlenül nem azért mert az integer maximum értéke csak 32767?"
De igen. Kicsit kifejtem. A számítógép soha sem az egész számok teste feletti algebrai struktúrába dolgozik. Tudom ez nagyon tudományosan hangzik, próbálok minél kevesebbet "káromkodni", bár így hosszabban lehet megfogalmazni.
A 32767 bit képét kéne megnézni integer-be hogy lássuk miért az a legnagyobb szám.Előjeles kettes komplemensben lévő szám ...
Ha összeadsz (integer-be) 2 pozitív számot az összeg nem biztos hogy pozitív lesz, nem a szokásos értelembe kell érteni az összeadást, szorzásra is igaz. Ezt is figyelembe kell venni, régen sokat szívtam vele. Meg van ennek is az oka, nem azért van hogy szívassák az embert.
Én is megoldottam,a readln helyett csináltam egy bizotnsagosIntegerReadln függvényt, ami visszaadja, hogy legális értéket adtál e meg, beírhatod azt is kiscsica, meg sem "rebben".
Nem baj ha nem érted teljesen a kódot még, csak láss ilyet is.
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!