Kezdőoldal » Számítástechnika » Programozás » Hogyan lehet meghatározni,...

Hogyan lehet meghatározni, hogy n szám tökéletes vagy nem?

Figyelt kérdés
Free Pascalban írnom kell egy programot, amely meghatározza egy n számról, hogy tökéletes-e? Nem nagyon megy. Tudna valaki segíteni?
2017. okt. 18. 19:03
1 2 3 4 5
 21/45 anonim ***** válasza:
30%

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.

2017. okt. 18. 21:49
Hasznos számodra ez a válasz?
 22/45 anonim ***** válasza:
21# Lol, csak nem merik beismerni, hogy hülyeséget kommentelt xD, ami kicsit furcsa, mert teljesen anonymitást élveznek a gyakorin...
2017. okt. 18. 21:54
Hasznos számodra ez a válasz?
 23/45 tabaki ***** válasza:
93%
Ugyan, miért beszélnénk hülyeségeket? A program régen megvan mindkét változatban, a táblázatosnak annyi az erénye, hogy a kiszámolósnak a Kérdező szintjén megvalósítható lehetőségeit messze meghaladó értékek esetén is megoldja a feladatot, villámgyors, és még ráadásul tanulságos is. Senki nem mondta, hogy Kérdező ne próbálja megírni a tanára által vélhetőleg elvárt módon, ugyanakkor lásson rá arra is, hogy némely feladatnak sokkal praktikusabb trükkös megoldása is létezhet.
2017. okt. 18. 23:41
Hasznos számodra ez a válasz?
 24/45 anonim ***** válasza:
#23 Ez már csak magyarázkodás, szerintem engedd ezt el.. :D
2017. okt. 18. 23:55
Hasznos számodra ez a válasz?
 25/45 tabaki ***** válasza:
94%
A magyarázat csak addig magyarázkodás, amíg nem vagy hajlandó megérteni...
2017. okt. 18. 23:59
Hasznos számodra ez a válasz?
 26/45 anonim ***** válasza:

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.

2017. okt. 19. 10:44
Hasznos számodra ez a válasz?
 27/45 anonim ***** válasza:

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.

2017. okt. 19. 11:46
Hasznos számodra ez a válasz?
 28/45 tabaki ***** válasza:

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

2017. okt. 19. 13:37
Hasznos számodra ez a válasz?
 29/45 SimkoL ***** válasza:

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.

2017. okt. 19. 15:22
Hasznos számodra ez a válasz?
 30/45 SimkoL ***** válasza:
Lacikám ne 'idegíd' fel magad, nem ér annyit.
2017. okt. 19. 15:27
Hasznos számodra ez a válasz?
1 2 3 4 5

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!