def items(b)
return (1..(b - 1)).inject([]) {|s, i| s + items(b - i).collect{|j| ( + j).sort}}.sort
end
p items(5).uniq.reverse
[C],Перечислить все представления положительного целого числа
Ребята привет есть такая задача: Перечислить все представления положительного целого числа n в виде суммы последовательности невозрастающих целых положительных слагаемых; что тут делать?
Код:
[COLOR="Red"]Cразу,в названии темы указывай язык программирования,чтоб избежать недоразумений и не нарушать Правила раздела Студентам.[/COLOR] модератор.
Код:
#include <stdio.h>
#include <stdlib.h>
// Слагаемое
struct Item {
int n;
struct Item *next;
struct Item *prev;
};
// Распечатать все представления числа N,
// такого что N=n+(сумма все слагаемых в списке sum).
// т.е. sum - частичное представление числа N, а n - еще
// не разложенный остаток.
void numberRep (int n, Item *sum)
{
if (!n) {
Item *r;
char *sep="";
for (r=sum; r; r=r->next==sum? 0: r->next) {
printf ("%s%d", sep, r->n);
sep="+";
}
printf ("\n");
return;
}
Rep *r=(Rep*)malloc(sizeof *r);
if (sum) {
r->next=sum;
(r->prev=sum->prev)->next=r;
sum->prev=r;
} else r->next=r->prev=r;
for (int i=n; i>0; i--) {
r->n=i;
numberRep (n-i, r);
}
if (sum) {
r->prev->next=sum;
sum->prev=r->prev;
}
free (r);
}
int main(int argc, char **argv)
{
numberRep (10, 0);
}
#include <stdlib.h>
// Слагаемое
struct Item {
int n;
struct Item *next;
struct Item *prev;
};
// Распечатать все представления числа N,
// такого что N=n+(сумма все слагаемых в списке sum).
// т.е. sum - частичное представление числа N, а n - еще
// не разложенный остаток.
void numberRep (int n, Item *sum)
{
if (!n) {
Item *r;
char *sep="";
for (r=sum; r; r=r->next==sum? 0: r->next) {
printf ("%s%d", sep, r->n);
sep="+";
}
printf ("\n");
return;
}
Rep *r=(Rep*)malloc(sizeof *r);
if (sum) {
r->next=sum;
(r->prev=sum->prev)->next=r;
sum->prev=r;
} else r->next=r->prev=r;
for (int i=n; i>0; i--) {
r->n=i;
numberRep (n-i, r);
}
if (sum) {
r->prev->next=sum;
sum->prev=r->prev;
}
free (r);
}
int main(int argc, char **argv)
{
numberRep (10, 0);
}
Заодно это и пример работы с двусвязанным списком.
Как понимать строку:
Rep *r=(Rep*)malloc(sizeof *r);
Ребята, вопрос не закрыт!!!