понедельник, 14 января 2008 г.

задача - перевод из одной системы счисления в другую

Программистская задача
Старая, но хорошая. Для интервью, пожалуй, сложновасто, а как головоломка сгодится.

Дан целый массив, про который известно, что его элементы имеют значения в диапазоне от 0 до 7 включительно и весь он представляет одно большое восьмеричное число (концеватость по вкусу). Написать программу, которая переводит это число в десятичный вид (с той же концеватостью), используя O(1) дополнительной памяти.


Понравилось решение автора:

Без единого гвоздя умножения, деления или вычисления остатка, прошу заметить.

// Given an integer represented as a big-endian array of base 'b' digits,
// converts it into base 'b+1'.

void stepup (int b, unsigned char digits[], int n)
{
for (int i=n-1; i>0; i--) {
for (int j=1; j <= i; j++) {
if ( (char) (digits[j] -= digits[j-1]) < 0 ) {
digits[j] += b+1;
digits[j-1] -= 1;
}
}
}
}
void octal2decimal (unsigned char digits[], int n)
{
stepup(8, digits, n);
stepup(9, digits, n);
}

Комментариев нет: