给定区间
这个问题来自Codechef。
我的做法是创建一个大小为b的数组,对于从2开始的每个数字,我执行以下操作。
当数字为2时,检查
当数字为3时,检查
由于
最后,值
问题:
a
到 b
,以及数字 k
,找出在 a
到 b
范围内所有的 k-质数(包括 a 和 b)。
k-质数的定义:一个数恰好具有 k 个不同的质因数。
例如,当 a=4
,b=10
,k=2
时,答案为 2
。因为数字 6 的质因数是 [2,3],而数字 10 的质因数是 [2,5]。
以下是您需要翻译的内容:#include<stdio.h>
#include<stdlib.h>
int main(){
int numOfInp;
scanf("%d",&numOfInp);
int a,b,k;
scanf("%d %d %d",&a,&b,&k);
int *arr;
arr = (int*)calloc(b+1,sizeof(int));
int i=2,j=2,count=0;
//Count is the count of distic k prim factors for a particular number
while(i<=b){
if(arr[i]==0){
for(j=i;j<=b;j=j+i){
arr[j]++;
}
}
if(i>=a && arr[i]==k)
count++;
i++;
}
printf("%d\n",count);
free(arr);
return 0;
}
这个问题来自Codechef。
我的做法是创建一个大小为b的数组,对于从2开始的每个数字,我执行以下操作。
当数字为2时,检查
arr[2]
是否为0,如果是,则arr[2]++,arr[4]++,arr[6]++ ....
以此类推。当数字为3时,检查
arr[2]
是否为0,如果是,则arr[3]++,arr[6]++,arr[9]++ ....
以此类推。由于
arr[4]
不为零,因此跳过它。最后,值
arr[i]
将给出答案,即arr[2]
为1,因此2是1-质数,arr[6]
为2,因此6是2-质数。问题:
- 这段代码的复杂度是多少,可以在O(n)内完成吗?
- 我是否使用了动态编程?
[2,b]
中的每个质数运行一次。这些质数的数量不是b
而是更小。该算法称为埃拉托色尼筛法。http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Algorithm_complexity - cyonn*log(n)
。 - levengli