Всевозможные произведения в массиве

295
20 января 2017, 07:48

Не могу написать рабочий алгоритм нахождения всех возможных произведений элементов массива. То есть к примеру у нас есть массив на n элементов. Требуется найти произведение любых пар элементов, любых троек и так далее до произведений всех элементов.

Answer 1

Нашел тут, когда-то сочинял генератор кодов Грея. Поскольку работает и для этой задачи годится - вот не самое, конечно, эффективное, но решение :) Просто если в массиве нет нулевого значения, то на каждом очередном шаге новое произведение можно вычислить только одним делением или умножением, не перебирая все элементы массива.

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
class Gray
{
public:
    Gray(int N):N(N),a(N+1,false),last_(-1){}
    ~Gray() = default;
    Gray(const Gray&) = default;
    Gray(Gray&&)      = default;
    Gray& operator=(const Gray&) = default;
    Gray& operator=(Gray&&)      = default;
    size_t size() const { return N; }
    void reset(size_t newN = 0)
    {
        if (newN) N = newN;
        vector<bool> b(N+1,false);
        std::swap(a,b);
        last_ = -1;
    }
    bool operator[](size_t idx) const { return a[idx]; }
    int  last() const { return last_; }
    bool next()
    {
        size_t j;
        if (!a[N]) j = 0; else {
            for(j = 0; j < N; ++j) if (a[j]) break;
            ++j;
        }
        if (j == N) return false;
        a[N] = !a[N];
        a[j] = !a[j];
        last_ = j;
        return true;
    }
private:
    vector<bool> a;
    size_t N;
    int last_;
};

int main(int argc, const char * argv[])
{
    int m[] = { 2, 3, 5, 7 };
    Gray g(sizeof(m)/sizeof(m[0]));
    do {
        if (g.last() >= 0)
        {
            int p = 1;
            for(size_t i = 0; i < g.size(); ++i) if (g[i]) p *= m[i];
            cout << setw(6) << p << " = ";
            for(size_t i = 0, first = 1; i < g.size(); ++i)
                if (g[i]) {
                    if (!first)
                    {
                        cout << " * ";
                    }
                    else
                    {
                        first = 0;
                    }
                    cout << m[i];
                }
            cout << "\n";
        }
    } while(g.next());
    // Только произведения - если нет нулевого элемента.
    g.reset();
    int p = 1;
    do {
        if (g.last() >= 0)
        {
            if (g[g.last()]) p *= m[g.last()]; else p /= m[g.last()];
            cout << setw(6) << p <<"\n";
        }
    } while(g.next());
}
Answer 2
#include <bits/stdc++.h>
using namespace std;
int main() {
    vector<int> count = {10,15,30,100};
    vector<int> res;
    res.reserve(1 << count.size());
    res.push_back(1);
    for (unsigned int mask = 1; mask < (1 << count.size()); mask++)
        res.push_back ( res[ mask & (mask - 1) ] * count [ __builtin_ctz(mask) ] );
    for (int x: res)
        cout << x<< " ";
    return 0;
}

Например так...

По просьбе @VladD - генератор стиль (без доп памяти)

#include <bits/stdc++.h>
using namespace std;
int main() {
    vector<int> count = {10,15,30,100};
    for (unsigned __int128 mask = 0; mask < (1 << count.size()); mask++){
        unsigned long long res = 1;
        __int128 tm = mask;
        for ( ; tm ; tm &= (tm - 1) )
            res *= count [ __builtin_ctz(tm) ];
        cout << res<<" ";
    }
    return 0;
}
READ ALSO
QCamera не работает вне IDE

QCamera не работает вне IDE

Использую Qt Creator, Qt 57

338
Работа с контейнерами set и stack в отладчике Code::Blocks

Работа с контейнерами set и stack в отладчике Code::Blocks

Возможно ли просматривать содержимое контейнеров (в частности set и stack интересуют) из STL пошаговой отладке? Если да, то как? Code::Blocks 1601

289
Список файлов в вектор

Список файлов в вектор

Используя библиотеку boost 163, я пытался реализовать вывод список файлов в директории в вектор с типом string

249
Как импортировать sql файл из mysql в MS sql?

Как импортировать sql файл из mysql в MS sql?

У меня есть файдsql из mysql мне уго надо импортировать в database от microsoft sql server

341