тут i сдвигается вправо на i1 двоичных разрядов (битов) и из результата извлекается младший бит.
Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.
Fast писал(а)>>
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.
Вот для заданных значений (minIndx и maxIndx):
int i,i1;
int arr[6];
for( i=0; i<64; i++ )
{
if ( i < minIndx || i > maxIndx )
continue;
for( i1=0; i1<minIndx; i1++ )
arr[i1] = 0;
for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
arr[i1+minIndx] = ( i >> i1 ) & 1;
for( i1=0; i1<(6-maxIndx+1); i1++ )
arr[i1+maxIndx] = 0;
// массив заполнен, проверим этоPrint("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
}
Fast>>:
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.
Тогда, простейшим, но не оптимальным по времени исполнения будет такой подход:
1) Генерируем числа из заданного диапазона для всей строки.
2)Пишем эту строку в базу
3)Генерируем новую строку чисел
4)Сверяем с базой
5)Если в базе нет такой строки, дописываем, если есть, п. 3)
И так пока не заполним базу заданного размера. Можно применить и другие критерии останова.
Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.
1) вынесите то, что внутри цикла
for( i=0; i<64; i++ )
в функцию, а саму эту переменную передавайте в функцию в качестве аргумента.
Результатом функции должен быть заполненный массив и следующее значение итератора i (будете передавать его в функцию при следующем вызове)
2) какие могут быть повторяющиеся элементы, если используется перебор?
Попробовал вот этот код.... все работает..., Только как мне еще учесть размер массива...
тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?
int F1(int i)
{
int i1;
for( ; i<minIndx; i++ )
;
if ( i > maxIndx )
return(6);
if ( i < minIndx || i > maxIndx )
continue;
for( i1=0; i1<minIndx; i1++ )
arr[i1] = 0;
for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
arr[i1+minIndx] = ( i >> i1 ) & 1;
for( i1=0; i1<(6-maxIndx+1); i1++ )
arr[i1+maxIndx] = 0;
// массив заполнен, проверим этоPrint("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
return(i);
}
Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.
Fast писал(а)>>
Попробовал вот этот код.... все работает..., Только как мне еще учесть размер массива...
тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?
используйте функцию:
int F1(int i, int arrsize)
{
int i1;
string str;
for( ; i<minIndx; i++ )
;
if ( i > maxIndx )
return(arrsize);
if ( i < minIndx || i > maxIndx )
continue;
for( i1=0; i1<minIndx; i1++ )
arr[i1] = 0;
for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
arr[i1+minIndx] = ( i >> i1 ) & 1;
for( i1=0; i1<(arrsize-maxIndx+1); i1++ )
arr[i1+maxIndx] = 0;
// массив заполнен, проверим это
str = "";
for( i1=0; i1<arrsize; i1++ )
str = StringConcatenate(str,arr[i1]);
Print("arr: ",str);
return(i);
}
Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.
:) Вроде немного стал понимать Ваш код. Вы уж извините что я такой недо программист и понимаю наверное с 10 раза....
За что у Вас отвечают переменные maxIndx и minIndx? Если я правильно понял то за отрывок в массиве который подвергается перебору?
Если да, то минимальное значение не нужно использовать, так как оно всегда равно 0 (это первый элемент массива), а вот размер максимального элемента меняется по нарастающей тоесть в начале он равен 5, что значит в используемом мною массиве arr[15] последним элементом будет считаться 4й. Затем количество элементов увеличивается и последний элемент уже 5й. затем 6й и так далее...
Перебирать нужно с 2го элемента (тоесть это всегда arr[1]) до пред последнего arr[tek_raz-1] (tek_raz это текущий используемый последний элемент массива). Вот в общемто что мне нужно сделать.ТОесть например если это будет функция то нужно перебрать все эелементы в массиве arr учитывая его текущий размер tek_raz.
Нужно найти все варианты значений из заданного диапазона в массиве произвольного размера?
значения элементов массива могут быть либо 0 либо 1.
тут i сдвигается вправо на i1 двоичных разрядов (битов) и из результата извлекается младший бит.
Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.
Тогда, простейшим, но не оптимальным по времени исполнения будет такой подход:
1) Генерируем числа из заданного диапазона для всей строки.
2)Пишем эту строку в базу
3)Генерируем новую строку чисел
4)Сверяем с базой
5)Если в базе нет такой строки, дописываем, если есть, п. 3)
И так пока не заполним базу заданного размера. Можно применить и другие критерии останова.
Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.
в функцию, а саму эту переменную передавайте в функцию в качестве аргумента.1) вынесите то, что внутри цикла
Результатом функции должен быть заполненный массив и следующее значение итератора i (будете передавать его в функцию при следующем вызове)
2) какие могут быть повторяющиеся элементы, если используется перебор?
Вот для заданных значений (minIndx иmaxIndx):
Спасибо, попробую Ваш код.тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?
Спасибо, попробую Ваш код.
Вот Вам функция, тестируйте:
Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.
Попробовал вот этот код.... все работает..., Только как мне еще учесть размер массива...
тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?
используйте функцию:
Вот Вам функция, тестируйте:
Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.
:) Вроде немного стал понимать Ваш код. Вы уж извините что я такой недо программист и понимаю наверное с 10 раза....За что у Вас отвечают переменные maxIndx и minIndx? Если я правильно понял то за отрывок в массиве который подвергается перебору?
Если да, то минимальное значение не нужно использовать, так как оно всегда равно 0 (это первый элемент массива), а вот размер максимального элемента меняется по нарастающей тоесть в начале он равен 5, что значит в используемом мною массиве arr[15] последним элементом будет считаться 4й. Затем количество элементов увеличивается и последний элемент уже 5й. затем 6й и так далее...
Перебирать нужно с 2го элемента (тоесть это всегда arr[1]) до пред последнего arr[tek_raz-1] (tek_raz это текущий используемый последний элемент массива). Вот в общемто что мне нужно сделать.ТОесть например если это будет функция то нужно перебрать все эелементы в массиве arr учитывая его текущий размер tek_raz.