Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2011, 01:41   #1
Sonejka
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 10
По умолчанию Булевые векторы

Задача. Вывести все булевые векторы размерности n и весом m (все сочетания из n по m). использовать рекурсию.

проблема: надо вставить единицы в указанное место и не догоняю как. вот код (С++) :

Код:
//-------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <conio>
#pragma hdrstop

using namespace std;

//-------------------------------------------------------------------------
#pragma argsused

const unsigned C1[32]={ 0x80000000,0x40000000,0x20000000,0x10000000,
                        0x8000000,0x4000000,0x2000000,0x1000000,
                        0x800000,0x400000,0x200000,0x100000,
                        0x80000,0x40000,0x20000,0x10000,
                        0x8000,0x4000,0x2000,0x1000,
                        0x800,0x400,0x200,0x100,
                        0x80,0x40,0x20,0x10,
                        0x8,0x4,0x2,0x1};

// число сочетаний из н по м
 long combine (int n, int m){
       int i,j,z=1,ch=1;
               for (i=n-m+1,j=1;i<=n,j<=m;i++,j++){
                 ch*=i;
                 z*=j;
               }
       return ch/z;
}
//функция, которая теоретически делает чё надо и почти работает
       void f1(unsigned *B, int n, int m){
       int a=0;
         if (m==1){
               for (int i=0; i<n; i++)   // 1 бегает по диагонали
                   B[i]|=C1[i];
               return;
          }
         if (n==m){
               for (int i=0; i<m;i++)  //  один единичный вектор
                    B[0]|=C1[i];
               return;
           }
         long k=combine(n-1,m-1);
         f1(B,n-1,m-1);
          //тут таинственным способом надо вставить в какое-то место 1
         f1(B+k,n-1,m-1);

       }


int main(int argc, char* argv[])
{
         int m,n,i;
         cin>>n>>m; //задание размерности и веса вектора
         unsigned *B=new unsigned [n];
         for (i=0;i<n;i++)
         B[i]=0x0;
         f1(B,n,m);//вызов нашей функции
         for (int j=0; j<combine(n,m); j++){
           for (int i=0; i<n; i++){ //Вывод вектора
                if(B[j]&C1[i]) cout<<1<<" ";
                else cout<<0<<" ";
             }
           cout<<endl;
           }             
         getch();
         return 0;
}
//-------------------------------------------------------------------------
Sonejka вне форума Ответить с цитированием
Старый 22.04.2011, 13:34   #2
Sonejka
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 10
Печаль

вроде вставила то, чего не хватало, но не фурычит. помогите кто ошибку найти, пожалуйста!
Код:
//-------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <conio>
#pragma hdrstop

using namespace std;

//-------------------------------------------------------------------------
#pragma argsused

const unsigned C1[32]={ 0x80000000,0x40000000,0x20000000,0x10000000,
                       0x8000000,0x4000000,0x2000000,0x1000000,
                       0x800000,0x400000,0x200000,0x100000,
                       0x80000,0x40000,0x20000,0x10000,
                       0x8000,0x4000,0x2000,0x1000,
                       0x800,0x400,0x200,0x100,
                       0x80,0x40,0x20,0x10,
                       0x8,0x4,0x2,0x1};

// число сочетаний из н по м
 long combine (int n, int m){
      int i,j,z=1,ch=1;
              for (i=n-m+1,j=1;i<=n,j<=m;i++,j++){
                ch*=i;
                z*=j;
              }
      return ch/z;
}
//функция
      void f1(unsigned *B, int n, int m){

        if (m==1){
              for (int i=0; i<n; i++)   // 1 бегает по диагонали
                  B[i]|=C1[i];
              return;
         }
        if (n==m){
              for (int i=0; i<m;i++)  //  один единичный вектор
                   B[0]|=C1[i];
              return;
          }

        f1(B,n-1,m-1);
         //вставка единиц
        long k=combine(n-1,m-1);
         for(int i=0;i<k;i++){
               B[i]|=C1[m-1];
         }
        f1(B+k,n-1,m-1);
      }


int main(int argc, char* argv[])
{
        int m,n,i;
        cin>>n>>m; //задание размерности и веса вектора
        unsigned *B=new unsigned [n];
        for (i=0;i<n;i++)
        B[i]=0x0;
        f1(B,n,m);//вызов функции
        for (int j=0; j<combine(n,m); j++){
          for (int i=0; i<n; i++){ //Вывод вектора
               if(B[j]&C1[i]) cout<<1<<" ";
               else cout<<0<<" ";
            }
          cout<<endl;
          }
        getch();
        return 0;
}
//-------------------------------------------------------------------------
Sonejka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрицы и векторы otto07 Помощь студентам 0 03.03.2011 00:10
булевые переменные alligator Паскаль, Turbo Pascal, PascalABC.NET 2 28.01.2011 10:39
векторы и строки С\С++ Айдар Помощь студентам 6 16.09.2010 22:12
векторы и файлы boomeer Общие вопросы C/C++ 2 05.08.2010 19:15
Векторы в С++ Many man Помощь студентам 5 26.04.2009 12:35