The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
我自己的解法思路是先判断该数(记为A)是否为prime,如果是,则直接返回它本身。否则从该数的一半开始(记为index),判断index是否能被A整数以及index是否是prime,当两者同时满足时,返回index,否则index自减1。 判断某数是否为prime的算法,是从该数的平方根数开始一个一个检查。代码如下:
#include <stdio.h>
#include <math.h>
//#include <limits.h>
int is_prime(long l);
long largest_prime_factor(long l);
int main(int argc, char *argv[])
{
long result = largest_prime_factor(600851475143L);
printf("%ld\n",result);
return 0;
}
int is_prime(long l){
long l_sqrt = (long)sqrt(l);
long i = 2L;
for(; i <= l_sqrt; i++){
if(l % i == 0)
return 0; /* is not prime */
}
/* is prime */
return 1;
}
long largest_prime_factor(long l){
if(is_prime(l))
return l;
long l_mid = l/2;
long l_ind;
for(l_ind = l_mid; l_ind >=2; l_ind--){
if((l%l_ind == 0) && is_prime(l_ind))
return l_ind;
}
return 1; // never come here
}
上面的算法很惨,算了几十分钟都没有算出结果。所以最后我放弃了,google到了下面这个算法:
#include <stdio.h>
long largest_prime_factor(long l);
int main(int argc, char *argv[])
{
long result = largest_prime_factor(600851475143L);
printf("%ld\n",result);
return 0;
}
long largest_prime_factor(long l){
long factor = 2L;
while(l > 1L){
while(l % factor == 0 ){
l = l / factor;
}
factor++;
}
return (factor-1);
}
细想一下,这个算法与筛选法类似。但是,我怎么就没想到呢?FAIL!!!
没有评论:
发表评论