Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Matemaattinen pulma, ratkaisu ohjelmoinnilla

Sivun loppuun

Omasual [27.03.2008 20:09:20]

#

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.

ajv [27.03.2008 20:21:14]

#

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.

TsaTsaTsaa [27.03.2008 20:23:02]

#

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;
}

Antti Laaksonen [27.03.2008 20:26:55]

#

Tutkimalla kaksinumeroisia kokonaislukujen neliöitä riittää viiden lukuparin kokeilu...

Omasual [28.03.2008 10:56:19]

#

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).")";
      }
  }
?>

ajv [28.03.2008 10:59:37]

#

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.

Antti Laaksonen [28.03.2008 11:10:44]

#

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.

Chiman [28.03.2008 11:16:43]

#

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

ajv [28.03.2008 11:31:41]

#

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 :)

Niko [28.03.2008 11:48:58]

#

<?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

Newb [28.03.2008 12:32:36]

#

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

Sami [28.03.2008 13:25:47]

#

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. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta