Dziś prościutka zagadka.
Mamy do dyspozycji dwie trójki i dwie ósemki:
3, 3, 8, 8
Zadaniem jest ustawić je w odpowiedniej kolejności tak, by z pomocą czterech podstawowych operatorów matematycznych w wyniku dostać 24.
Dopuszczalne operatory to: + (dodawanie), - (odejmowanie lub zmiana znaku na przeciwny), / (dzielenie) oraz * (mnożenie). Wolno też używać nawiasów w celu wymuszenia właściwej kolejności działań.
I to wszystko. Żadnych pierwiastków, logarytmów, żadnego zaokrąglania, całek, silni ani innych cudaków. Tylko cztery podstawowe działania plus nawiasy.
Czas - start!
Jeśli wynik będzie intem, to: =8*8/3+3 😉
Nie zaokrąglamy. Liczymy matematycznie, nie komputerowo.
Najbliżej oczekiwanej wartości była taka kombinacja: 8.0/(3.0- 8.0/ 3.0) = 23,99995200009
jeszcze sprawdzę, dla podwójnych nawiasów…
set nocount on
declare @res table (komb varchar(100), wynik float);
declare @txt varchar(100);
DECLARE @cur CURSOR;
SET @cur= CURSOR FOR
with licz as (select 3.0 x union select 8.0),
znaki as (select '+’ z union select ’-’ union select '*’ union select '/’ ),
naw as (select ’ ’ n union select '(’ union select ’)’)
select concat (n1.n, a.x, z1.z, n2.n, b.x, z2.z, n3.n, c.x, z3.z, n4.n, d.x, n5.n) txt
from licz a, licz b, licz c, licz d, znaki z1, znaki z2, znaki z3,
naw n1, naw n2, naw n3, naw n4, naw n5
where a.x* b.x* c.x* d.x =576;
open @cur
FETCH next FROM @cur INTO @txt
WHILE @@fetch_status = 0
BEGIN
begin try
insert into @res
exec(’select ”’+@txt+”’ kombinacja,’ + @txt +’wynik’);
end try
begin catch
insert into @res(komb)
exec(’select ”’+@txt+”’ kombinacja’);
end catch
FETCH next FROM @cur INTO @txt
END
close @cur;
deallocate @cur;
select * from @res
where wynik is not null
order by wynik;
Ładnie! Rozwiązanie siłowe, ale jak najbardziej poprawne. Pamiętaj, że docelowo liczysz to matematycznie, bez procesorów, błędów zaokrągleń itd.