Игорь Пашев

Mar. 2nd, 2011

06:31 pm - Поиск общего предка в двоичном дереве

Даны два элемента дерева, надо найти их ближайшего общего предка.

Решение такое. Начинаем с корня.
Если один слева, а другой справа — предок найден (корень).
Если слева никого — идём рекурсивно направо.
Если справа никого — идёи рекурсивно налево.

Если оба элемента на одной ветви, то этот алгоритм не работает.
Ну и фиг с ним, ибо тогда один из элементов является предком другого.

Код на Си и пример с картинкой )

Tags: ,
(1 комментарий | Оставить комментарий)

Feb. 22nd, 2011

10:02 am - Ещё раз счастливые билеты

http://algolist.manual.ru/olimp/rec_prb.php
Задачи 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;
}

Tags: ,
(Оставить комментарий)

Dec. 3rd, 2010

03:56 pm

Q: Как быстрее в Си++ обнулится переменная:
A = 0; или A ^= A; ?


A: while ( (A=rand()) != 0 );


// http://otvety.google.ru/otvety/thread?tid=1d16b9f18492a542

Tags: ,
(4 комментария | Оставить комментарий)

Dec. 1st, 2010

07:08 pm - l < 12 + n/1000

Такова верхняя граница длины римского числа величиной n.

Например:

n=1  ->   I -> l=1
n=2  ->  II -> l=2
n=19 -> XIX -> l=3
Детали в Википедии.

Это нужно для рационального выделения памяти.
Программа )

Tags: ,
(Оставить комментарий)

Nov. 29th, 2010

11:18 pm

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;
}



gcc -save-temps test.c -o test:
    .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

gcc -O2 -save-temps test.c -o test:
	.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

Tags: , , ,
(3 комментария | Оставить комментарий)

05:51 pm

http://habrahabr.ru/blogs/sport_programming/108570/

Компиляция:

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

Исходник: )

Tags: ,
(Оставить комментарий)

Nov. 21st, 2010

02:42 pm

http://www.govnokod.ru/4502

Tags: ,
(Оставить комментарий)

Mar. 31st, 2009

02:30 pm

Firefox на одноядерном Селероне тормозит,
говорят, это из-за многочисленных sync(),
особенно при переключении вкладок.
sync надо отключить.

Решение такое:
http://ftp.die.net/pub/qmail-tools/libnosync.c (см. ниже)

В файл /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 )

Tags: , , , ,
(Оставить комментарий)

Nov. 30th, 2008

01:43 am - Re: Арифметика для взрослых

http://lj.rossia.org/users/neklyueva/686169.html

Обновил программу для поиска таких чисел в любой системе счисления )
Для N=4, например

0000 = 0
0001 = 1
0010 = 2
0100 = 4
0101 = 5
1000 = 8
1001 = 9
1010 = 10
N = 4, t = 8

Tags: , ,
(7 комментариев | Оставить комментарий)

01:27 am

В стандартной библиотеке C до сих пор нет
стандартного способа получить символьное
представление двоичного числа (например,
с помощью printf("%b"), как это сделано в PHP)

Tags: ,
(Оставить комментарий)