Kuulin tänään kivan pulman, menee seuraavasti:
(a+b)^2 = ab
Eli yksinumeroisten lukujen a & b summa toiseen on a ja b "vierekkäin". Eli siis ei ole tässä tapauksessa kertomista, vaikka tuo siltä näyttääkin.
Meinasin vääntää tästä koodia PHP:llä, joka ratkaisisi tuon, mutta meni sormi heti suuhun. Onko mahdollista?
Tiedän vastauksen, mutta en kerro sitä tässä, jos joku haluaa ratkoa.
Pikakokeilulla noita vastauksia löytyy useampiakin... Mutta ilman kummempaa algoritmia ns. brute forcella kaksi sisäkkäistä silmukkaa. Toinen kasvattaa A:ta ja toinen B:tä. Laskutoimitus, vertaus ja tulostus jos osui.
C++:
#include <iostream> using namespace std; int main() { for (int a = 1 ; a < 10 ; ++a) { for (int b = 1 ; b < 10 ; ++b) { if ( (a+b)*(a+b) == 10*a+b ) { cout << "a = " << a << ", b = " << b << endl; } } } return 0; }
Tutkimalla kaksinumeroisia kokonaislukujen neliöitä riittää viiden lukuparin kokeilu...
Tiesin, että joku tän ratkaisee helpostikin. TsaTsaTsaan esimerkistä lunttaamalla väänsin PHP-version
<? for($a=1;$a < 10;$a++) { for($b=1;$b < 10;$b++) { if (($a+$b)*($a+$b) == 10*$a+$b) echo "a = ".$a.", b = ".$b." (eli ".$a."+".$b." = ".($a+$b)."<sup>2</sup> = ".($a+$b)*($a+$b).")"; } } ?>
Antti Laaksonen kirjoitti:
Tutkimalla kaksinumeroisia kokonaislukujen neliöitä riittää viiden lukuparin kokeilu...
Voitko paljastaa hieman enemmän tästä menetelmästä? Tämmöiset kiinnostaa aina.
Kaksinumeroisia lukuja, jotka saadaan korottamalla jokin kokonaisluku toiseen potenssiin, ei ole monta, nimittäin vain luvut 16 (42), 25 (52), 36 (62), 49 (72), 64 (82) ja 81 (92). Jos ratkaisuja on olemassa, ne kuuluvat tuohon joukkoon. En kuitenkaan onnistunut eilen laskemaan noiden lukujen määrää oikein, niitähän on kuusi eikä viisi.
Laitetaanpa Python-ratkaisu:
parit = ((a, b) for a in range(10) for b in range(10) if (a+b)**2 == 10*a+b) for pari in parit: print 'a=%d, b=%d' % pari
(Näköjään Operassa koodi näkyy isommalla fontilla kuin Firefoxissa, joten tuo koodi rivittyy rumasti.)
Aa, niin tehtävänannossahan tosiaan luki, että yksinumeroisten lukujen a & b summa.... En lukenut noin tarkasti, eli tuo ensimmäinen väittämäni, että niitähän löytyy useampia ei pidä paikkaansa :)
<?php $alku = microtime(true); for ($x = 0; $x <= 1000000; $x++) { $n = pow($x, 2); if (strlen($n) < 2) continue; $loyty = false; for ($i = 1; $i <= strlen($n); $i++) { $a = substr($n, 0, $i); $b = substr($n, $i); if ($a + $b == $x) { $loyty = true; break; } } if (substr($b, 0, 1) == '0') $loyty = false; if ($loyty) echo '(', $a, ' + ', $b, ')^2 = ', $n, ' (', round(microtime(true) - $alku, 2), ') '; } ?>
Mun ratkaisu, paljon nopeampi kuin brute (4sek vs 8 ja puoli tuntia) :D
VB6
Private Sub Form_Load() Dim a As Integer, b As Integer For a = 1 To 9 Step 1 For b = 1 To 9 Step 1 If Int((a + b) ^ 2) = a & b Then MsgBox "a=" & a & " b=" & b Exit Sub End If Next b Next a End Sub
miksei ratkaisut, missä a = 0 tai b = 0 kävisi myös (esim. triviaaliratkaisu a = b = 0 => (0 + 0)^2 = 0 = 00)?
Ja tietystihän tuota voi lähteä ratkomaan analyyttisestikin:
(a + b)^2 = 10a + b
a^2 + 2ab + b^2 = 10a + b
a^2 + 2ab + b^2 -10a - b = 0
a^2 + a(2b - 10) + (b^2 - b) = 0
Ja siitä sitten ratkaisee tuon a:n suhteen toisen asteen yhtälön. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.