我已经为一个数字的素数因子分解编写了一个代码,但我不知道如何优化它以获得更大的数字更好的结果可以有人知道吗?
DWORD
答案 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以上没有偶数可以是素数。