Info 2 első házi feladat: három háromszögszám összege

Utolsó módosítás: 2009. február 19.

Háromszögszámnak hívjuk az f(k) = k · (k + 1) / 2 = 1 + 2 + … + k alakú számokat, ahol k nemnegatív egész szám. Az első néhány háromszögszám tehát 0, 1, 3, 6, 10, 15, ….

Gauss bebizonyította, hogy minden természetes szám előáll három háromszögszám összegeként. Ebben a házi feladatban ezt az állítást kell ellenőriznie kis számokra.

Írjon programot, amely 0-tól 80-ig minden természetes számnak megkeresi egy ilyen előállítását, és bizonyítékként kiír egyet a standard kimenetre. Például a 38 számhoz kiírhatjuk a következő két előállítás egyikét:

38 = f(4) + f(7) + f(0)
38 = f(8) + f(1) + f(1)

Ha egy számhoz több előállítás létezik, akkor mindegy, melyiket írja ki, és az is mindegy, milyen sorrendben; de minden számhoz csak egy lehetőséget írjon ki, mert az összes lehetőség kiírása túl hosszú kimenetet eredményezne.

Nem kell törődnie azzal, hogy a program nagyon gyorsan fusson le, mivel ilyen kis számokra még akkor is kivárható a program futása, ha minden lehetőséget megvizsgál.

A kiíráshoz egy ötlet, hogy a printf függvényt hívja meg a következő módon:

printf("%d = f(%d) + f(%d) + f(%d)\n", n, a, b, c);

A megoldást e-mailben küldje el az ambrus@@mmaatthh..bbmmee..hhuu (a dupla karaktereket csak egyszer kell beírni) címre. Az emailben csatolmányként küldje el a megoldáshoz használt forráskódot, és írhat bármilyen megjegyzéseket, amit a megoldással kapcsolatban lényegesnek talál. Az emailben feltétlenül adja meg a nevét, nem szeretnék névtelen házi feladatokat azonosítani.

Ha a feladathoz bármilyen kérdése van, vagy elakad a megoldással, akkor keressen meg emailben vagy személyesen, akár a gyakorlaton, akár azon kívül.

A feladatot 2009. február 19-én illetve 20-án tűzom ki. A megoldás határideje ehhez képest két hét, vagyis március 6. péntek (aznap még be lehet küldeni).