给定一个范围a
tob
和 number ,找出所有介于to [包括两者]k
之间的 k 素数。k-prime 的定义:一个数是 k-prime,如果它恰好有 k 个不同的质因数。a
b
即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) 内完成吗?
- 我在这里使用动态编程吗?