【发布时间】:2015-07-28 02:03:02
【问题描述】:
我用 C++ 编写了以下递归
#include <iostream>
#include <stdlib.h>
#include <math.h>
#define N 100
using namespace std;
long long int recursion(int array[], int begin,int end, long long int now){
if(now>N){
return 0;
}
else{
long long int huge_number=N/now;
for(int i=1;i<end-begin;i++){
huge_number=huge_number-recursion(array,begin+i,end,now*array[begin+i]);
}
return huge_number;
}
}
int main(int argc, const char * argv[]) {
int array[4]={2,3,5,7};
/*FILE * pFile;
pFile = fopen ("primes.txt","r");
for(int i=0;i<78498;i++){
fscanf(pFile, "%d", &priemen[i]);
}
fclose(pFile);*/
//I have actually a txt file with primes less than 10^6
int number_divisible[4];//this array will contain the desired numbers as explained below
for(int i=0;i<4;i++){
number_divisible[i]=N/array[i];
for(int j=0; j<i;j++){
number_divisible[i]=number_divisible[i]-recursion(array,j,i,array[i]*array[j]);
}
}
return 0;
}
此代码执行以下操作:例如 N=100。该数组将由最多为 N 平方根的素数组成,因此 array={2,3,5,7}。通过这种递归,我们可以计算出 2 到 100 之间的数有多少是 {2,3,5,7} 中素数 p 的倍数,但不是小于 p 的素数的倍数。
如果我想将它用于巨大的数字 N,比如 10^9,那么程序完成需要太多时间。
我的问题是我们是否可以优化上面给出的代码。如果不能,那么我必须找到一种不同的算法来计算上面解释的所需数字。
【问题讨论】:
-
编写的代码无法编译。你能包括
N的定义吗?是常数吗? -
@Yakk ,对不起,我没有包含所有代码,以便您可以编译它。我将编辑我的问题并添加必要的代码。
-
您的标题具有误导性,因为您的问题比优化递归更具体。此外,你没有表现出任何努力自己寻找答案。
-
你不应该关心递归性能。您需要更高效的算法。
-
您可能想了解动态规划:qr.ae/R2FpbQ