我正在一个竞争性编程网站上学习C。问题是,给定一个数字,该数字有多少个非素因数?我可以用这样的代码来做到这一点:
#include <stdio.h>
int totalNPF(int n){
int totalFactor = 1, temp = 0, primeFactor = 0;
for(int i=2; n!=1;){
while(n % i == 0){
n /= i;
temp++;
}
if(temp != 0){
totalFactor *= (temp+1);
primeFactor ++;
}
i++;
temp = 0;
}
return totalFactor-primeFactor;
}
int main(){
int T, n;
scanf("%d", &T);
for(int i=0; i<T; i++){
scanf("%d", &n);
printf("%d\n", totalNPF(n));
}
return 0;
}
我使用数论概念,但是它仍然很慢。运行时间超过1s。有人知道如何提高速度,让我可以将速度提高到1s或以下吗?
注意:该数字的约束为2x10 ^ 6
答案 0 :(得分:0)
通过将for(int i=2; n!=1;){
更改为for(int i=2; i*i <= n;){
,可以使程序运行更快。一旦n
小于当前候选因子的平方,这将终止对因子的搜索。在这一点之后,除了n
本身之外没有其他素因,因为如果j
是大于i
的素因,那么n/j
将会是小于i
。但是,应该从循环中的n
中提取出这样一个因素。
由于这意味着循环可能以n
为主要因素退出,因此有必要在循环后插入一些代码以测试n
是否大于1,如果是,请调整{ {1}}和totalFactor
。
通过仅测试质数作为候选因子,而不是测试2以后的每个整数,也可以使程序更快。请注意,由于要求程序支持最大2,000,000的数字,并且新循环将在primeFactor
的平方根处停止,因此仅需要最大1,414的质数。可以很容易地事先准备好这类素数的列表。