Не могу написать рабочий алгоритм нахождения всех возможных произведений элементов массива. То есть к примеру у нас есть массив на n элементов. Требуется найти произведение любых пар элементов, любых троек и так далее до произведений всех элементов.
Нашел тут, когда-то сочинял генератор кодов Грея. Поскольку работает и для этой задачи годится - вот не самое, конечно, эффективное, но решение :) Просто если в массиве нет нулевого значения, то на каждом очередном шаге новое произведение можно вычислить только одним делением или умножением, не перебирая все элементы массива.
#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());
}
#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;
}
Возможно ли просматривать содержимое контейнеров (в частности set и stack интересуют) из STL пошаговой отладке? Если да, то как? Code::Blocks 1601
Используя библиотеку boost 163, я пытался реализовать вывод список файлов в директории в вектор с типом string
У меня есть файдsql из mysql мне уго надо импортировать в database от microsoft sql server