уже 2 часа ломаю голову, никаких мыслей не приходит. а задачка вроде детская.
помогите плиз.
дано:
#define N 3
#define M 7 //2^3-1
#define LEN 16
int pos_arr[N]={1,5,7}; //позиции где должна быть единица. пусть будут для примера 1.5.7
int arr[M][LEN];
надо:
составить (2^N-1) LEN-разрядных векторов, у которых на позициях, номера которых, хранятся в массиве pos_arr — были комбинации единиц.
в данном конкретном случае
0100000000000000
0000010000000000
0000000100000000
0100010100000000
0100010000000000
0100000100000000
0000010100000000
Здравствуйте, i.dmitry, Вы писали:
ID>уже 2 часа ломаю голову, никаких мыслей не приходит. а задачка вроде детская.
ID>0100000000000000
ID>0000010000000000
ID>0000000100000000
ID>0100010100000000
ID>0100010000000000
ID>0100000100000000
ID>0000010100000000
Hint: можно пересортировать немного, и добавить нулевой вектор, будет понятнее:
0000000000000000
0000000100000000
0000010000000000
0000010100000000
0100000000000000
0100000100000000
0100010000000000
0100010100000000
Ничего не напоминает?
Здравствуйте, andy1618, Вы писали:
A>Здравствуйте, i.dmitry, Вы писали:
ID>>уже 2 часа ломаю голову, никаких мыслей не приходит. а задачка вроде детская.
ID>>0100000000000000
ID>>0000010000000000
ID>>0000000100000000
ID>>0100010100000000
ID>>0100010000000000
ID>>0100000100000000
ID>>0000010100000000
A>Hint: можно пересортировать немного, и добавить нулевой вектор, будет понятнее:
A>0000000000000000
A>0000000100000000
A>0000010000000000
A>0000010100000000
A>0100000000000000
A>0100000100000000
A>0100010000000000
A>0100010100000000
A>Ничего не напоминает? 
спасибо. очень грубо напоминает "двоичное" представление от 0x0 до 0x7
A>>Ничего не напоминает?
ID>спасибо. очень грубо напоминает "двоичное" представление от 0x0 до 0x7
Ну да. вот не очень красивое решение: счетчик N бит -> битовое представление ->далее например 101 -> {1,0,1}X{1,5,7} ->
1* (1<<1)+
0*(1<<5)+
1* (1<<7).
Как-то это более громоздко чем хочется.Наверно есть какое-то более красивое решение ( чтоб все битовые операции одной двумя командами сделать)
Здравствуйте, Аноним, Вы писали:
А>Как-то это более громоздко чем хочется.Наверно есть какое-то более красивое решение ( чтоб все битовые операции одной двумя командами сделать)
var
Mask, Subset: Integer;
begin
Mask := 2 + 32 + 128;
Subset:= 0;
repeat
Subset := (Subset - 1) and Mask; //на первом шаге Subset - 1 = 0xFFFFFFFF
Memo1.Lines.Add(IntToStr(Subset));
until Subset = 0;