Главная > Таинственная функция
1999

Выберите одну из приведенных ниже функций, на понятном Вам языке программирования и определите ее назначение. Постарайтесь строго доказать Ваше утверждение.

    
function func(x: longint): longint;
var
    y, z: longint;
begin
    func := -1;
    x := x - 1;
    if x mod 8 <> 0 then
        exit;
    y := 1;
    z := 2;
    x := x div 8;
    repeat
        if odd(x) then begin
            x := x - y - z;
            y := y + z + z;
        end;
        x := x div 2;
        z := z * 2;
    until x <= 0;
    if odd(x) then begin
        x := x + y - z;
        y := z + z - y;
    end;
    if x = 0 then
        func := y;
end;

long func(long x) {
    if (--x % 8) return -1;
    x /= 8;
    long y = 1, z = 2;
    do {
        if (x % 2) {
            x -= y + z;
            y += 2 * z;
        }
        x /= 2;
        z *= 2;
    } while (x > 0);
    if (x % 2) {
        x += y - z;
        y = 2 * z - y;
    }
    if (x) 
        return -1;
    else
        return y;    
}

Примечание: обе функции (на Паскале и Си++) исполняют один и тот же алгоритм. Функция вызывается от одного аргумента – натурального числа.

 
Hosted by uCoz