Программистская задача
Jan. 10th, 2008 04:31 pmСтарая, но хорошая. Для интервью, пожалуй, сложновасто, а как головоломка сгодится.
Дан целый массив, про который известно, что его элементы имеют значения в диапазоне от 0 до 7 включительно и весь он представляет одно большое восьмеричное число (концеватость по вкусу). Написать программу, которая переводит это число в десятичный вид (с той же концеватостью), используя O(1) дополнительной памяти.
Дан целый массив, про который известно, что его элементы имеют значения в диапазоне от 0 до 7 включительно и весь он представляет одно большое восьмеричное число (концеватость по вкусу). Написать программу, которая переводит это число в десятичный вид (с той же концеватостью), используя O(1) дополнительной памяти.
no subject
Date: 2008-01-11 12:53 am (UTC)no subject
Date: 2008-01-11 12:58 am (UTC)no subject
Date: 2008-01-11 07:07 am (UTC)no subject
Date: 2008-01-11 07:11 am (UTC)no subject
Date: 2008-01-11 07:14 am (UTC)Все промежуточные результаты (а не только конечный), естественно, храним в освободившейся части массива, а не в инте каком-нибудь.
no subject
Date: 2008-01-11 07:35 am (UTC)no subject
Date: 2008-01-11 02:58 pm (UTC)no subject
Date: 2008-01-11 04:54 pm (UTC)no subject
Date: 2008-01-11 05:59 pm (UTC)кстати, про 5 строчек интересно, у меня сильно больше получилось
#include "stdio.h"
int main()
{
const int N = 10;
const int BASE1 = 8;
const int BASE2 = 10;
int arr[N];
int i;
for (i = 0; i < N; i++) arr[i] = 1;
arr[7] = 2;
for (i = 1; i < N; i++)
{
int v = arr[i]; arr[i] = 0;
for (int j = 0; j <= i; j++)
{
v += arr[j] * BASE1;
arr[j] = v % BASE2;
v /= BASE2;
}
}
return 0;
}
как тест забито (8^10 - 1) / (8 - 1) + 8^2 = (1 111 111 211)_8 = 153391753_10
no subject
Date: 2008-01-11 06:01 pm (UTC)no subject
Date: 2008-01-11 06:25 pm (UTC)no subject
Date: 2008-01-11 06:38 pm (UTC)for (i = 0; i < (N / 2); ++i) swap(a[i], a[N - 1 - i]);
и все
перед return само собой
no subject
Date: 2008-01-11 06:44 pm (UTC)no subject
Date: 2008-01-11 06:45 pm (UTC)жду :)
Квадратичное время
Date: 2008-01-11 07:42 pm (UTC)o2d (ol:oh) = decplus ol (mul8dec (o2d oh))
Re: Квадратичное время
Date: 2008-01-11 07:43 pm (UTC)Re: Квадратичное время
Date: 2008-01-11 07:44 pm (UTC)Сейчас напишу код.
no subject
Date: 2008-01-11 08:02 pm (UTC)// Given an integer represented as an array of base-10 digits, multiply it by 8 // and add another number. // The integer to multiply begins with digit 1; the number to add is at digit 0; // the result begins with digit 0. void mul8decshiftadd (unsigned char digits[], int n) { unsigned char carry = digits[0]; digits[0] = 0; for (int i=1; i<n; i++) { digits[i-1] += (8*digits[i])%10; digits[i] = (8*digits[i])/10; } for (int i=0; i<n; i++) { unsigned char nextCarry = (carry+digits[i])/10; digits[i] = (carry+digits[i])%10; carry = nextCarry; } } // Given an integer represented as an array of base-8 digits, transform it to base 10. void octal2decimal (unsigned char digits[], int n) { for (int m=n-1; m>=0; m--) { mul8decshiftadd (digits+m, n-m); } }no subject
Date: 2008-01-11 08:54 pm (UTC)