Даны два элемента дерева, надо найти их ближайшего общего предка.
Решение такое. Начинаем с корня.
Если один слева, а другой справа — предок найден (корень).
Если слева никого — идём рекурсивно направо.
Если справа никого — идёи рекурсивно налево.
Если оба элемента на одной ветви, то этот алгоритм не работает.
Ну и фиг с ним, ибо тогда один из элементов является предком другого.
( Код на Си и пример с картинкой )
http://algolist.manual.ru/olimp/rec
Задачи 2 и 3.
Компилировать командой
gcc -Wall -Wextra -ansi -pedantic -lm happy.c -o happy
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
char n[] = "00";
void next (char *n)
{
++(*n);
while (*n > '9') {
*n = '0';
++n;
if (*n != '\0')
++(*n);
else
break;
}
}
int happy (char n[], size_t l)
{
size_t i;
int s = 0;
for (i = 0; i < l/2; ++i)
s += n[i];
for (i = l/2; i < l; ++i)
s -= n[i];
return s;
}
int main ()
{
int i;
size_t l;
size_t count = 0;;
l = strlen(n);
for (i = 0; i < pow(10, l); ++i) {
printf("%s -> ", n);
if (0 == happy(n, l)) {
printf("happy :-)\n");
++count;
}
else
printf("usual :-(\n");
next(n);
}
printf ("Total happy: %lu\n", (unsigned long)count);
return EXIT_SUCCESS;
}
Q: Как быстрее в Си++ обнулится переменная:
A = 0; или A ^= A; ?
A: while ( (A=rand()) != 0 );
// http://otvety.google.ru/otvety/thread?t
Такова верхняя граница длины римского числа величиной n.
Например:
n=1 -> I -> l=1 n=2 -> II -> l=2 n=19 -> XIX -> l=3Детали в Википедии.
gcc заменяет printf с простой строкой на puts.
С -O2 выкидывает куски кода внутри 100%-ложных условий (if (0) {...}).
Круто, чо :-)
test.c:
#include <stdlib.h> #include <stdio.h> const int DEBUG = 0; int main ( int argc, char *argv[] ) { if (DEBUG) { printf("Debug!\n"); } return EXIT_SUCCESS; }
.file "test.c" .globl DEBUG .section .rodata .align 4 .type DEBUG, @object .size DEBUG, 4 DEBUG: .zero 4 .LC0: .string "Debug!" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl DEBUG, %eax testl %eax, %eax je .L2 subl $12, %esp pushl $.LC0 call puts addl $16, %esp .L2: movl $0, %eax movl -4(%ebp), %ecx leave leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.4.4" .section .note.GNU-stack,"",@progbits
.file "test.c" .text .p2align 4,,15 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp xorl %eax, %eax popl %ebp ret .size main, .-main .globl DEBUG .section .rodata .align 4 .type DEBUG, @object .size DEBUG, 4 DEBUG: .zero 4 .ident "GCC: (GNU) 4.4.4" .section .note.GNU-stack,"",@progbits
http://habrahabr.ru/blogs/sport_programm
Компиляция:
gcc -ansi -pedantic -Wall -Wextra -O2 -save-temps code.c -o code
# echo '123 abc 987 abaacb' | ./code 123 -> 132 abc -> acb 987 -> abaacb -> ababac
Firefox на одноядерном Селероне тормозит,
говорят, это из-за многочисленных sync(),
особенно при переключении вкладок.
sync надо отключить.
Решение такое:
http://ftp.die.net/pub/qmail-tools/libno
В файл /usr/bin/firefox (скрипт)
добавить в начале:
if [ "$LD_PRELOAD" ] ; then LD_PRELOAD=$LD_PRELOAD:/usr/lib/libnosync.so else LD_PRELOAD=/usr/lib/libnosync.so fi( libnosync.c )
http://lj.rossia.org/users/neklyueva/68
( Обновил программу для поиска таких чисел
в любой системе счисления )
Для N=4, например
0000 = 0 0001 = 1 0010 = 2 0100 = 4 0101 = 5 1000 = 8 1001 = 9 1010 = 10 N = 4, t = 8
В стандартной библиотеке C до сих пор нет
стандартного способа получить символьное
представление двоичного числа (например,
с помощью printf("%b"), как это сделано в PHP)