如何优化此c程序以查找数字的素数因子分解

时间:2016-09-03 16:17:27

标签: c++ primes prime-factoring

我已经为一个数字的素数因子分解编写了一个代码,但我不知道如何优化它以获得更大的数字更好的结果可以有人知道吗?

DWORD

1 个答案:

答案 0 :(得分:1)

您的代码等同于

#include <stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    for(int j=2; j <= n; j++) {     // for each j in 2..n,

        int t=0;
        for(int i=1; i<=j; i++) {   // count j's divisors
            if(j%i==0) {            //   among 1..j
                t++;
            }
        }

        if( t==2 ){                 // if j is prime:   NB!
            int c=0, nn=n;
            while( nn%j==0 ) {      //   count multiplicity of j 
                c++;                //   as divisor of n, and
                nn /= j;
            }
            if( c!=0 ){             //   report a prime divisor and 
                printf(" %d  %d \n", j, c);   // its multiplicity
            }
        }
     }
     return 0;
}

但实际上所需要的只是:

int main(){
    int n, c=0;
    scanf("%d", &n);
    for(int j=2; j <= n; j++) {     // for each j in 2..n,

            int c=0;
            while( n%j==0 ) {       // if j divides n
                c++;                //   count its multiplicity
                n /= j;             //   while dividing it out of n
            }                       //   NB!  changing the `n`  NB!
                                    //   which guarantees j is prime
            if( c!=0 ){             //       when c != 0
                printf(" %d  %d \n", j, c);
            }
    }
    return 0;
}

所以最后的重要优化是

int main(){
    int n, c=0;
    scanf("%d", &n);
    for(int j=2; j*j <= n; j++) {   // here

            int c=0;
            while( n%j==0 ) {
                c++;
                n /= j;             
            }
            if(c!=0){
                printf(" %d  %d \n", j, c);
            }
    }
    if(n>1) {                       // and here
        printf(" %d  %d \n", n, 1);
    }
    return 0;
}

接下来,您可以尝试在主循环中找到一种通过 2 增加j的方法,以便只有奇数的范围,因为 2以上没有偶数可以是素数。