给定范围[1,200万],对于此范围内的每个数字,我需要生成 并将每个整数的除数的数量存储在数组中。有效计算范围内整数除数的总数
所以,如果X = P1 ^(A1)* P2^A2 * P3^A3,其中,P1,P2,P3是素数, x的除数的总数由下式给出(P1 + 1)(P2 +1)(p3 + 1)。我生成了所有的 2000以下的素数,并且对于范围内的每个整数,我做了试验分区 以获得每个素因子的功效,然后使用上面的公式计算除数并存储在一个数组中。 但是,这样做很慢,需要大约5秒钟才能为给定范围内的所有数字生成 的分配数量。
我们可以用其他一些有效的方法做这笔总和吗,可能没有将每个 的数字因数分解?
下面是我现在使用的代码。
typedef unsigned long long ull;
void countDivisors(){
ull PF_idx=0, PF=0, ans=1, N=0, power;
for(ull i=2; i<MAX; ++i){
if (i<SIEVE_SIZE and isPrime[i]) factors[i]=2;
else{
PF_idx=0;
PF=primes[PF_idx];
ans=1;
N=i;
while(N!=1 and (PF*PF<=N)){
power = 0;
while(N%PF==0){ N/=PF; ++power;}
ans*=(power+1);
PF = primes[++PF_idx];
}
if (N!=1) ans*=2;
factors[i] = ans;
}
}
}
感谢您的回答。我很抱歉我提出了错误的问题。我实际上需要每个整数除以200万以下的除数。 – praveen 2012-02-07 10:55:18
@praveen然后只是因素[j] ++;'而不是因素[j] + = i;'。 – btilly 2012-02-07 14:24:27