Генерация всех возможных подмножеств на Bornald C++ 3. 1

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Lei fang
Сообщения: 49
Зарегистрирован: 28 май 2005, 21:25
Откуда: Саратов
Контактная информация:

А понятно, а то я до сих пор не могу разобраться со скриншотом... Ну хорошо, теперь его не надо грузить на сервак
Еще раз спасибо тебе, Eugie.
Lei fang
Сообщения: 49
Зарегистрирован: 28 май 2005, 21:25
Откуда: Саратов
Контактная информация:

Ах да... Вот что там написано:

printf("Введите количество элементов в множестве");

printf("Введите элемент номер %d ", i+1);
Lei fang
Сообщения: 49
Зарегистрирован: 28 май 2005, 21:25
Откуда: Саратов
Контактная информация:

Ах... Вот еще... Эта программа не генерирует пустое подмножество.
Чтобы создавалось впечатление, что пустое подмножество генерируется, нужно в самом начале записать в файл символ "0"
dagrs
Сообщения: 3
Зарегистрирован: 01 июн 2005, 15:43

Алгоритм R.W.Gosper-а
используется для генерации последовательности подмножеств по возрастанию порядка от пустого, до всего множества.

Код: Выделить всё

#include <iostream>
#include <cmath>

using namespace std;

unsigned snoob( unsigned x )
{
    unsigned smallest, ripple, ones;

    smallest = x & -x;
    ripple   = x + smallest;
    ones     = x ^ ripple;
    ones     = (ones >> 2)/smallest;
    return   ripple | ones;
}

void outSet( unsigned x )
{
    cout << "{";
    if(!x) { cout << "}"; return; }

    int num = 1; // номер бита, начиная с 1
    for(;;)
    {
        if( x==1 ) { cout << num << "}"; return; }
        if( x&1 ) cout << num << ", ";
        x >>= 1;
        ++num;
    }
}

int main()
{
    unsigned N;
    cout << "Input order set N = ";
    cin >> N;
    cout << endl;

    unsigned Ord1 = unsigned(pow(2,N));

    // подмножества из K элементов
    for( unsigned K = 0; K <=N; ++K )
    {
        unsigned x         = unsigned(pow(2,K))-1; // min subSet
        unsigned maxSubSet = Ord1 - unsigned(pow(2,N-K));

        for(;;)
        {
            if( x == maxSubSet ) {  outSet(x); cout<< endl; break; }
            outSet(x); cout << ", ";
            x = snoob(x);
        }
    }

    return 0;
}
Лёгкость, искромётность, молниеносность!!!
Lei fang
Сообщения: 49
Зарегистрирован: 28 май 2005, 21:25
Откуда: Саратов
Контактная информация:

Как я понимаю это тоже VC++ 6.0?
dagrs
Сообщения: 3
Зарегистрирован: 01 июн 2005, 15:43

Точно
Лёгкость, искромётность, молниеносность!!!
Lei fang
Сообщения: 49
Зарегистрирован: 28 май 2005, 21:25
Откуда: Саратов
Контактная информация:

А жаль
Ответить