这里是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define pii pair<int, int>
#define MAX 46656
#define LMT 216
#define LEN 4830
#define RNG 100032
unsigned base[MAX/64], segment[RNG/64], primes[LEN];
#define sq(x) ((x)*(x))
#define mset(x,v) memset(x,v,sizeof(x))
#define chkC(x,n) (x[n>>6]&(1<<((n>>1)&31)))
#define setC(x,n) (x[n>>6]|=(1<<((n>>1)&31)))
// http://zobayer.blogspot.com/2009/09/segmented-sieve.html
void sieve()
{
unsigned i, j, k;
for (i = 3; i<LMT; i += 2)
if (!chkC(base, i))
for (j = i*i, k = i << 1; j<MAX; j += k)
setC(base, j);
primes[0] = 2;
for (i = 3, j = 1; i<MAX; i += 2)
if (!chkC(base, i))
primes[j++] = i;
}
//http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/
vector <pii> factors;
void primeFactors(int num)
{
int expo = 0;
for (int i = 0; primes[i] <= sqrt(num); i++)
{
expo = 0;
int prime = primes[i];
while (num % prime == 0){
expo++;
num = num/prime;
}
if (expo>0)
factors.push_back(make_pair(prime, expo));
}
if (num >= 2)
factors.push_back(make_pair(num, 1));
}
vector <int> divisors;
void setDivisors(int n, int i) {
int j, x, k;
for (j = i; j<factors.size(); j++) {
x = factors[j].first * n;
for (k = 0; k<factors[j].second; k++) {
divisors.push_back(x);
setDivisors(x, j + 1);
x *= factors[j].first;
}
}
}
int main() {
sieve();
int n, x, i;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
primeFactors(x);
setDivisors(1, 0);
divisors.push_back(1);
sort(divisors.begin(), divisors.end());
cout << divisors.size() << "\n";
for (int j = 0; j < divisors.size(); j++) {
cout << divisors[j] << " ";
}
cout << "\n";
divisors.clear();
factors.clear();
}
}
第一部分,筛()是用来寻找素数,并把他们的素数[]数组。按照链接查找有关该代码的更多信息(按位筛选)。
第二部分primeFactors(x)以一个整数(x)为输入,找出它的素因子和相应的指数,并将它们放入矢量因子[]中。例如,primeFactors(12)将填因素[]以这种方式:
factors[0].first=2, factors[0].second=2
factors[1].first=3, factors[1].second=1
为12 = 2^2个* 3^1个
第三部分setDivisors()递归地调用自身来计算所有的x的因子,使用矢量因子[]并将它们放入矢量因子[]中。
它可以计算任何适合int的数的除数。它也很快。
你认为什么是“不好”关于你提出的素数的方法呢?对我而言,这听起来像是大数字最可行的方法。已知分解是一个“困难”(即缓慢)的问题。世界上大部分地区都依赖于这个事实。你知道你期望的最大输入大小吗?不太一般的方法可能是预先计算适合输入范围的素数表,然后使用它。 – BoBTFish 2014-11-05 09:49:11
我认为'得到所有可能的组合这些主要因素'不能有效。 – zangw 2014-11-05 09:57:06
平均而言,只获得主要因素然后生成组合可能会更好。如果原始数字是素数,那不会有帮助,但如果不是,那么您的分区数量就会少得多。 – harold 2014-11-05 09:58:57