Страница: 1 |
Страница: 1 |
Вопрос: Любопытная задачка
Добавлено: 22.01.05 22:22
Автор вопроса: Sharp | Web-сайт:
По заданному N найти все уникальные наборы чисел a[1..N] такие, что 1/a[1] + 1/a[2] + ... + 1/a[N] = 1. Перестановки не учитывать.
Пример:
N=3
2 3 6
2 4 4
3 3 3
Еще один вопрос, больше теоретический. Предполагая, что ни одно число не выходит за границы типа Long, определить накладываемый этим условием предел на N.
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 23.01.05 17:19
Ну вот, я думал, хоть кто-нибудь решит... Вот мое решение:
По заданному N найти все уникальные наборы чисел a[1..N] такие, что 1/a[1] + 1/a[2] + ... + 1/a[N] = 1. Перестановки не учитывать.
20 января 2005 года © Остапенко Денис
*/
#include "stdio.h"
int res[20][10000], lp=0, n;
void simplize(int *nom, int *den){
int t1 = *nom, t2 = *den, t;
while(t1%t2){
t1 = t1%t2;
t = t1;
t1 = t2;
t2 = t;
}
*nom /= t2;
*den /= t2;
}
void calc(int nom, int den, int ns){
int i;
if(ns == 1){
if(nom ==1){
res[n-ns][lp] = den;
lp++;
for(i=0; i<n; i++) res[lp] = res[lp-1];
}
return;
}
else{
i=n-ns?res[n-ns-1][lp]:2;
while(den >= nom*i) i++;
while(ns*den >= i*nom){
res[n-ns][lp] = i;
int nnom, nden;
nnom = nom*i - den;
nden = den * i;
simplize(&nnom, &nden);
calc(nnom, nden, ns-1);
i++;
}
}
}
int checkdouble(){
int u=1, i, j, k;
for(k=0; k<n; k++) printf("%d\t", res[k][0]);
printf("\n"
for(i=1; i<lp; i++){
for(j=0; j<n; j++){
if(res[j] != res[j][i-1]) break;
}
if(j < n){
for(k=0; k<n; k++) printf("%d\t", res[k]);
printf("\n"
u++;
}
}
return u;
}
void main(){
printf("Enter N: "
scanf("%d", &n);
calc(1, 1, n);
printf("%d\n", checkdouble());
}
Максимальное N = 6.
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 23.01.05 21:52
Че-то длинно Я уже решал, у мня короче кажись... тоже писал на Си, но исходника найти не смог
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 23.01.05 22:32
Ну, можно провести хакеризацию этого кода, он станет раза в 4 меньше
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 24.01.05 01:32
) во, что-то похожее на дело )
Кстати, есть индивидумы, по-крайней мере у нас в группе таковые существовали, что все писали в одну единственную строчку
Мне бывало жаль нашего преподователя
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 24.01.05 02:08
Глянь сюда: www.ioccc.org
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 24.01.05 10:45
Нащ препор после многолетних тренировок любой (почти) обфускатор опустит с таким-то опытом
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 24.01.05 12:50
Маза собрать воедино все известные методы обфускации исходного кода на всех языках и выпустить, как шутливую статью "Как нужно писать программы".
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 24.01.05 15:33
) Это как был прикол про то как придумали синтаксис Си языка
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 25.01.05 00:43
Да, наслышан, хотя на самом деле история куда более прозаическая