Tökéletes számok Javascriptben?
Azt a feladatot kaptuk, hogy amikor beírunk egy számot, a program kiírja, hogy tökéletes szám -e, vagy nem. Nagyon régóta szenvedek vele, tudnátok egy kicsit segíteni?
Előre is köszönöm!
Hol állsz éppen? Mi nem megy?
Nem tudjuk, hogy miben kell segíteni, a teljes kódot meg senki sem fogja megírni neked.
Az első tíz tökéletes szám a Wiki alapján: [link]
6
28
496
8128
33 550 336
8 589 869 056
137 438 691 328
2 305 843 008 139 952 128
2 658 455 991 569 831 744 654 692 615 953 842 176
191 561 942 608 236 107 294 793 378 084 303 638 130 997 321 548 169 216
Ezek után további gond? A 'nagyobbakat' egyszerűen már értelmezni sem tudod számként. Bepakolod egy string tömbbe őket, a továbbit rád bízom. De végül is számolgathatsz is, sok értelem nincs a fentiek alapján.
#2-nek igaza van abban hogy elég kevés "kicsi" tökéletes szám van, így egyszerűen csak le kell ellenőrizni hogy benne van az első 20-ban mondjuk, a fölött már több ezer karakter hosszúak ezek a számok. De szerintem azért kaptátok ezt a feladatot, hogy írjatok egy egyszerű algoritmust a tökéletes számok tesztelésére.
Ha a szám megegyezik a nála kisebb osztóinak az összegével, akkor tökéletes. Tehát a feladat hogy megkeresed az osztókat, összeadod őket és megnézed hogy egyenlő e a beírt számmal.
Legyen egy változód amiben tárolod az osztók összegét, majd keresd meg a szám osztóit úgy, hogy egy ciklussal végigmész az összes számon és megnézed hogy osztják e a bekért számot. Amikor találsz egy osztót, akkor az összeget megnöveled az osztóval. Amikor a ciklussal eléred a bekért szám felét (a felénél nagyobb valódi osztója nincs), kilépsz a ciklusból.
Pszeudokódban ez valahogy így néz ki:
bekér: szám
összeg = 0
ciklus i= 1-től szám/2-ig {
ha szám % i == 0 { összeg = összeg + i }
}
ha összeg == szám { kiír: "Tökéletes" }
egyébként { kiír: "Nem tökéletes" }
És ha nem is JavaScriptben, de itt egy működő megoldás (Python 3):
n = int(input('Írj be egy számot: '))
print('Tökéletes szám?', n==sum(i for i in range(1,n//2+1) if n%i==0))
Ennél nyilván vannak hatékonyabb megoldások és 100 milliós tartományban már elég lassú, de kezdetnek megfelel.
PHP-ban ez is egy megoldás:
$szam = $szam_masolat = 8128;
$osztok = array();
while(true) {
$osztok[] .= $szam;
if($szam <= 1) {
break;
}
$szam = ceil($szam / 2);
}
$eredmeny = array_sum($osztok);
if(($eredmeny / 2) == $szam_masolat) {
echo 'Tokeletes';
}
else {
echo 'Nem tokeletes';
}
JS-t annyira nem tudom... :(
köszönöm szépen a segítséget, főleg a 3. válaszadónak!
jelenleg így áll, de nem azt csinálja, amit kéne..
<script language ="Javascript">
a= parseInt (prompt("Írjon be egy számot"))
osszeg = 0
for ( i=6; i<=a; i++) {
if ( a%i == 0) {osszeg=osszeg+i}
}
if ( osszeg == a ) {
document.write ("tökéletes szám");
}
else {
document.write ("nem tökéletes szám");
}
</script>
ha 1-et írok be, azt tökéletes számnak veszi, viszont semmi mást nem..
Nem olvastad át az egészet.
<script language ="Javascript">
a = parseInt (prompt("Írjon be egy számot"))
osszeg = 0
for ( i=0; i<=a/2; i++) {
if ( a%i == 0) {osszeg=osszeg+i}
}
if ( osszeg == a ) {
document.write ("tökéletes szám");
}
else {
document.write ("nem tökéletes szám");
}
</script>
mégis sikerült, el sem hiszem!
köszönöm szépen még egyszer a segítséget! :)
Az én megoldásom jobb és sokkal gyorsabb, mint a tietek. Ezt a számot is simán leellenőrzi: 137438691328
Nem minden számot ellenőrzök, hanem csak felezek és mindig felkerekítek, ezeket ha össze adom, akkor az ellenőrzendő számnak a duplájának kell kijönni, ha tökéletes.
Átírtam JS-re a PHP-t:
var szam = szam_masolat = parseInt (prompt("Irjon be egy szamot"));
var osztok_osszege = 0;
var ellenorzes = true;
while(ellenorzes) {
if(szam == 1) ellenorzes = false;
osztok_osszege += szam;
szam = Math.ceil(szam / 2);
console.log(szam);
}
if((osztok_osszege / 2) == szam_masolat) {
document.write('Tokeletes');
} else {
document.write('Nem tokeletes');
}
Kérdező:
A kódodban a hiba a ciklusod:
for ( i=6; i<=a; i++) {
Nem 6-tól hanem 1-től kell indulni, és nem szabad az "a"-t beleszámolni!
for ( i=1; i<a; i++) {
Még jobb ha csak a feléig mész el:
for ( i=1; i<=a/2; i++) {
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!