Форум: "Прочее";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизПятничные задачки, в основном простенькие Найти похожие ветки
← →
VICTOR_ (2006-03-04 01:34) [80]12.
A+B+C=11
2+3+6=11
? - A
Ответ.
На втором(A=2). Очевидно вместе с зятем A :)
P.S.Коротко объясню логику. Так как написан не бред шизофреника, то пытаемся читать между строчек формулы для математика :)
← →
VICTOR_ (2006-03-04 02:47) [81]1.
Не прав ни Петя, ни Вася
0,5pi-sqrt(3)/2 < 0,25pi
То есть площади данной фигуры меньше четверти круга
← →
VICTOR_ (2006-03-04 02:51) [82]1.
Пропустил, уже решена :(
← →
default © (2006-03-04 10:26) [83]5. 1-sqr(tg(Pi/5))=~0.47
← →
SergP. (2006-03-04 15:55) [84]13. Алгоритм-то простой, но есть одна трудность, связаная с диапазоном...
Так как бывают такие числа до миллиона, что несколько последующих членов последовательности больше миллиона.
Проблем нет при прямом переборе, но если идти обратным путем, то уже проблематично...
Моя прога нашла возможно это число что нам нужно:
910107 Длина последовательности 475
function GetChislo:integer;
var
count:integer;
procedure rq(cnt:integer;ch:integer);
begin
if (ch<1000000) and (cnt>count) then begin
count:=cnt;
result:=ch;
form1.Memo1.Lines.Add(inttostr(ch)+"=="+inttostr(count));
Application.ProcessMessages;
end;
if ch<100000000 then // Ограничение на числа из последовательности
begin
inc(cnt);
if (ch>4) and (((ch-1) mod 3) = 0) and ((((ch-1) div 3) mod 2)=1)
then rq(cnt,(ch-1) div 3);
rq(cnt,ch*2);
end;
end;
begin
count:=0;
rq(0,1);
end;
но существует проблема на ограничение чисел которые могут встречаться в последовательности.
← →
mrcat © (2006-03-04 22:31) [85]>79] MBo © (03.03.06 21:22)
Забыл добавить в алгоритм условие сократимости :)
EVE = 242; DID = 303;
← →
Bless © (2006-03-06 09:01) [86]> MBo © (03.03.06 17:02) [55]
> Верно (C(15,6)-1)
Расскажи, как получается эта формула, плз. А то я решал иначе, длиннее.
← →
MBo © (2006-03-06 09:56) [87]>mrcat © (04.03.06 22:31) [85]
>EVE = 242; DID = 303;
Все правильно
>SergP. (04.03.06 15:55) [84]
У меня прямой расчет такой:
function Leng(m: Int64): Integer;
begin
Result := 0;
while m <> 1 do begin
if Odd(m) then
m := 3 * m + 1
else
m := m div 2;
Inc(Result);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
m, l, lm, nm: Integer;
begin
lm := 0;
nm := 0;
for m := 1 to 1000000 do begin
l := Leng(m);
if l >= lm then begin
lm := l;
nm := m;
end;
end;
Caption := Format("Longest chain %d started at %d", [lm, nm]);
end;
837799 524
>Bless © (06.03.06 09:01) [86]
>Расскажи, как получается эта формула, плз. А то я решал иначе, длиннее.
Я тоже длинно решал, с рисованием ступенчатых графиков. Попробую обобщить с помощью первоисточника:
Рассмотрим "генератор" неубывающего десятичного числа из последовательности битов, что-то вроде конечного автомата.
Стартовая (текущая) десятичная цифра числа (не последовательности!) - 0. Идем по бинарной последовательности.
Единичный бит означает увеличение текущей цифры на 1, нулевой бит - вывод текущей цифры.
Например, 110010 приводит к трехзначному числу 223
бит тек.цифра вывод
--- 0
1 1
1 2
0 2 2
0 2 2
1 3
0 3 3
Понятно, что для вывода N-значных чисел в последовательности должно быть N нулей, а единиц может быть до 9.
Таким образом, для вывода 6-значных чисел нужно узнать число бинарных строк длиной 15, содержащих 6 нулей. Это С(15,6) (единица отнимается, если исключать 0)
← →
Bless © (2006-03-06 10:33) [88][87]
Красиво, однако
← →
default © (2006-03-06 11:43) [89][83] верно?
по 6 хотел спросить что значит бросить наудачу точку на плоскость?
а то могут получаться разные решения из-за разного толкования как в парадоксах Бертрана с хордами
← →
Bless © (2006-03-06 11:43) [90]Кстати, а существуют ли достаточно эффективные алгоритмы вычисления выражений типа C(N, M) для машины?
← →
SergP. (2006-03-06 12:46) [91]
> MBo © (06.03.06 09:56) [87]
М-да... Если использовать int64 то и моим способом ИМХО найдется 837799 524, но это будет слишком долго. и поэтому неэффективно...
А прямым способом просто было как-то неинтерестно... И к тому же так как была задана такая задача я подумал что и решать ее нужно не "в лоб"...
Хотя попробую еще подумать... Может что-то и получится...
← →
MBo © (2006-03-06 13:28) [92]>default © (06.03.06 11:43) [89]
>[83] верно?
Да, верно, пропустил ранее.
>по 6 хотел спросить что значит бросить наудачу точку на плоскость?
Для бесконечной плоскости, конечно, трудно толково определить это.
Ну пусть будет хорошим приближением что-то вроде MaxInt*(Random*2-1) по каждой координате.
>Bless © (06.03.06 11:43) [90]
>Кстати, а существуют ли достаточно эффективные алгоритмы вычисления выражений типа C(N, M) для машины?
Не знаю.
Если нужно много разных C(n,k), то разумно будет построить половинку треугольника Паскаля, а если нет возможности хранить таблицу, то придется что-то подобное делать:
function C(n, k: Integer): Int64;
var
i: Integer;
begin
Result := 1;
if k < n - k then
k := n - k;
for i := k + 1 to n do
Result := Result * i;
for i := 2 to n - k do
Result := Result div i;
end;
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.064 c