Показать сообщение отдельно
Старый 16.12.2004, 07:09     # 7
yunus
Guest
 
Сообщения: n/a

хитрый способ

если уж очень хитро то так -
Код:
program Task1;

uses
  SysUtils;

function HDiv(A, B: Integer): Integer;
{Делит a на b возвращая результат или 0 в случае невозможности}
function Recurse(Min, Max: Integer): Integer;
var
  Res: Integer;
begin
    if Min = Max then
    begin
      if B * Min = A then
        Recurse := Min
      else
      begin
        Recurse := 0;
      end;
    end else
    begin
      Res := (Max + Min) div 2;
      if B * Res = A then
        Recurse := Res
      else
      if B * Res > A then
      begin
        if Res = Max then
          Recurse := 0
        else
          Recurse := Recurse(Min, Res)
      end else
      begin
        if Res = Min then
          Recurse := 0
        else
          Recurse := Recurse(Res, Max);
      end;
    end;
end;

begin
  if B > A div 2 then {совсем без деления -  Max := A shr 1}
  begin
    if A = B then
      HDiv := 1
    else
      HDiv := 0;
  end else
    HDiv := Recurse(2, A div 2);
end;

var
  c: Integer;
begin
  c :=  HDiv(120, 6);  {сюда вставляются числа}

  if c = 0 then
    Writeln('Inaccessible result')
  else
    Writeln('Result - ', c);
  Readln;
end.
- хотя нормальный человек просто отнимал бы в цикле b от a до получения результата