Hogyan lehet meghatározni, hogy n szám tökéletes vagy nem?
Simko: Egyszerűbb volna beismerned, hogy véded a védhetetlent, Tabaki barátoddal együtt.
A dolog lényegét leírták, nem az a fontos, amit te annak tartasz. Pláne, hogy még lakkozod is magad, hiszen tudod jól, hogy hülyeséget beszélsz.
Ha én tanár lennék nem fogadnám el a táblázatos megoldást mert túl egyszerű megvalósítani de én a tanárral ellentétben nem felejtettem volna ezt kijelenteni.
Én bátran oda mernék állni a táblázatos megoldással a tanár elé aztán jól lehülyézném ha nem tetszene neki mert a feladathoz a kritériumokat nem adta meg és így a diák pedig nem okolható ha a tanár elképzeléseinek ellent megy a megoldása.
26# Lol a kritériumokat nem adta meg?
Honnan tudod? Lehet, hogy egy A4-es oldani leírást kaptak a feladathoz :) Nem tudhatod. A kérdező meg nem rakta fel rosszúl vagy félre érthetően a kérdést. Csak valaki még a beszélgetés elején elmondta, hogy nem praktikus kiszámolni, mert kevés tökéletes számot ismerünk....
és?
A feladatoknak nem kell praktikusnak lenniük. Nagyon sok eszeveszett feladatot kellet megoldanom az iskolában, sőt még egyetem alatt is.
„Ha én tanár lennék, nem fogadnám el a táblázatos megoldást, mert túl egyszerű megvalósítani”
Tetszik, hogy „a tanárt” mindenki valami lóellenzős gondolkodású kishivatalnoknak képzeli, aki garantáltan nem képes felfogni egy jó, ráadásul egyszerű gyakorlati megoldás előnyeit. A kifordult megítélésemmel én ezt egészen másképp látom, szerintem nem is érdemli meg a tanár nevet, ha nem értékeli.
„Nehezebb összedobni egy algoritmust a tökéletes szám kiszámolására, mint egy For loopal összehasonlítani egy számot egy arrayben előre meghatározott számokkal. Gondolom ha ilyen egyszerű lenne a megoldás, nem tenné ki a kérdést.”
Hm, mitől is nehezebb? A számnak maximum a feléig össze kell adogatni egy ciklusváltozó aktuális értékeit ha azok osztói a számnak, és az összeget használni a táblázat helyett, ennyi a nagy algoritmus. Jóformán semmivel sem bonyolultabb. Kérdezőnek véletlenül ez a szimpla megoldás sem ugrott be a, ezért tette föl a kérdést.
„A programozástanulás lényege megteremteni azt a skillsetet, amivel hatékonyan tudsz majd programozni. Szerinted mitől fejlődnek többet a gyerek készségei: Hogy talál egy trükkös megoldást egy problémára (amit meg se kell már találnia, lévén leírtátok neki), vagy ha ő maga állít elő egy erre alkalmas algoritmust?”
Az első mondat furcsa ellentétben áll a folytatással. Ez a bizonyos skillset csak gazdagabb lesz azzal, ha Kérdező ismeri a (tapintatosan szólva) milliárdszor hatékonyabb elkerülő megoldást is. A probléma vagy-vagy megközelítését meg továbbra sem értem. Csak egy programnak van rubrika a leckefüzetben, vagy mi?
„Simko: Egyszerűbb volna beismerned, hogy véded a védhetetlent, Tabaki barátoddal együtt. A dolog lényegét leírták, nem az a fontos, amit te annak tartasz.”
„Lol, csak nem merik beismerni, hogy hülyeséget kommentelt xD”
„Ez már csak magyarázkodás, szerintem engedd ezt el.. :D”
Még egy kis magyarázkodás, még egy kis védhetetlenvédés. A fölényes lesajnálás nyilván abból ered, hogy SimkoL táblázata természetszerűleg véges, míg az általános algoritmus a végtelen számsor egészében érvényes. Ahol a táblázat véget ér, SimkoL megbukott, miközben a kiszámolós változat zakatol tovább, tovább...
Van ezzel egy nem éppen jelentéktelen gond, mégpedig az, hogy az algoritmus még nem program. Azzal szédítitek egymást és Kérdezőt, hogy ezt az általános megoldást hétköznapi szinten olyan programba tudjátok foglalni, amely meghaladja a táblázat lehetőségeit. Ez pedig nem igaz, nagyon hamar beleütköztök ugyanis a gépi számábrázolás korlátaiba. Igen, ezek a korlátok speciális, kifejezetten a különösen nagy számok kezelésére kidolgozott programozási technikák segítségével átléphetők (éppen így találták meg az eddig belátható tökéletes számokat), de azt, hogy ezeket Kérdezőnek tudnia kell alkalmazni, meséljétek a nénikéteknek a reggeli kávé mellett. Egyszerű halandónak marad a legnagyobb beépített egész adattípus, Free Pascal esetén a nyolc bájtos QWord. Ennek a maximális értéke 18446744073709551615, ennél nagyobb számot már beolvasni sem tudtok. Mellesleg, még ezt megközelíteni is kockázatos, mert az osztók összeadásakor átléphetitek a határt, és akkor a túlcsordulás miatt téves eredményt kaphattok. A QWord már a nyolcadik tökéletes szám (2305843008139952128) tárolására is alkalmatlan, tehát a program a gyötrelmesen hosszú számolás ellenére is csak az alját kapirgálja annak a tartománynak, amelyben a bosszantóan együgyű táblázatos változat azonnali és csalhatatlan eredményt ad.
Természetesen én leszek a legboldogabb, ha #21 és #22 részletesen kifejti, hol szaladt cigányútra az okoskodásom, és most már -- félre a fokozatos rávezetés szép pedagógiai eszméjével! -- színről-színre bemutatja a programját, amely egyszer s mindenkorra a lomtárba veti a táblázatos hülyeséget.
Csak hogy ne legyen 'táblázatos' a megoldás itt egy egyszerű, gyors, minden magyarázat nélkül:
program egy_tokeletes;
{$APPTYPE CONSOLE}
uses SysUtils, Math;
var input_szam : Int64;
hiba : Integer;
s : String;
function kobre( n : Int64) : Boolean;
var alap, szam : Extended;
begin
Result := False;
if n = 6 then
begin
Result := True;
Exit;
end;
szam := 0;
alap := -1;
while szam < n do
begin
alap := alap + 2;
szam := szam + Power(alap, 3);
end;
if szam = n then Result := True;
end;
function gyanu( n : Int64) : Boolean;
var j, osszeg : Int64;
begin
Result := False;
j := 2;
osszeg := 1;
while j * j <= n do
begin
if n mod j = 0 then osszeg := osszeg + j + (n div j);
if j * j = n then osszeg := osszeg - j;
Inc(j);
end;
if osszeg = n then Result := True;
end;
begin
hiba := -1;
while hiba <> 0 do
begin
Write('Kerem a szamot: ');
ReadLn(s);
Val(s, input_szam, hiba);
end;
if (input_szam mod 10 = 6) or (input_szam mod 10 = 8) then
begin
if kobre(input_szam) then
if gyanu(input_szam) then
WriteLn('Tokeletes: ', input_szam)
else WriteLn('Nem tokeletes: ', input_szam);
end
else WriteLn('Nem tokeletes: ', input_szam);
ReadLn;
end.
Jelzem igényli a tökéletes számokról való ismereteket.
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!