如何以快速的运行时间获取总数的非素因数?

时间:2018-12-17 14:23:24

标签: c

我正在一个竞争性编程网站上学习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

1 个答案:

答案 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的质数。可以很容易地事先准备好这类素数的列表。