194

计算数字的最大素数的最佳方法是什么?

我认为最有效的方法如下:

  1. 找到能整除的最小素数
  2. 检查除法的结果是否为素数
  3. 如果没有,找到下一个最低的
  4. 转到 2。

我将这个假设建立在更容易计算小素数的基础上。这是对的吗?我应该研究哪些其他方法?

编辑:我现在意识到,如果有超过 2 个素数在起作用,我的方法是徒劳的,因为当结果是其他两个素数的乘积时,第 2 步失败,因此需要递归算法。

再次编辑:现在我意识到这仍然有效,因为最后找到的素数必须是最高的,因此对第 2 步的非素数结果的任何进一步测试都会导致更小的素数。

4

29 回答 29

146

这是我所知道的最好的算法(在 Python 中)

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1

    return factors


pfs = prime_factors(1000)
largest_prime_factor = max(pfs) # The largest element in the prime factor list

上述方法在O(n)最坏的情况下运行(当输入是素数时)。

编辑:
以下是O(sqrt(n))评论中建议的版本。这是代码,再一次。

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1
        if d*d > n:
            if n > 1: factors.append(n)
            break
    return factors


pfs = prime_factors(1000)
largest_prime_factor = max(pfs) # The largest element in the prime factor list
于 2009-01-05T12:18:04.773 回答
140

实际上,有几种更有效的方法可以找到大数的因子(对于较小的因子,试行工作相当好)。

如果输入数字具有非常接近其平方根的两个因子,则一种非常快的方法称为费马分解。它利用恒等式 N = (a + b)(a - b) = a^2 - b^2 并且易于理解和实现。不幸的是,它通常不是很快。

对长达 100 位的数字进行因式分解的最著名方法是二次筛。作为奖励,部分算法很容易通过并行处理完成。

我听说过的另一种算法是Pollard 的 Rho 算法。它不像一般的二次筛那样有效,但似乎更容易实现。


一旦你决定如何将一个数字分成两个因子,这是我能想到的最快的算法来找到一个数字的最大素因子:

创建一个优先级队列,该队列最初存储数字本身。每次迭代,您从队列中删除最大的数字,并尝试将其分成两个因素(当然,不允许 1 成为这些因素之一)。如果这一步失败,数字是素数,你有答案!否则,您将这两个因素添加到队列中并重复。

于 2008-10-28T03:44:38.280 回答
17

我的回答是基于Triptych的,但在此基础上改进了很多。它基于这样一个事实,即除了 2 和 3,所有质数都是 6n-1 或 6n+1 的形式。

var largestPrimeFactor;
if(n mod 2 == 0)
{
    largestPrimeFactor = 2;
    n = n / 2 while(n mod 2 == 0);
}
if(n mod 3 == 0)
{
    largestPrimeFactor = 3;
    n = n / 3 while(n mod 3 == 0);
}

multOfSix = 6;
while(multOfSix - 1 <= n)
{
    if(n mod (multOfSix - 1) == 0)
    {
        largestPrimeFactor = multOfSix - 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }

    if(n mod (multOfSix + 1) == 0)
    {
        largestPrimeFactor = multOfSix + 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }
    multOfSix += 6;
}

我最近写了一篇博客文章,解释了这个算法是如何工作的。

我敢冒险,一种不需要对素数进行测试(也不需要筛子构造)的方法会比使用这些方法运行得更快。如果是这样的话,这可能是这里最快的算法。

于 2009-05-06T14:52:12.280 回答
8

JavaScript 代码:

'option strict';

function largestPrimeFactor(val, divisor = 2) { 
    let square = (val) => Math.pow(val, 2);

    while ((val % divisor) != 0 && square(divisor) <= val) {
        divisor++;
    }

    return square(divisor) <= val
        ? largestPrimeFactor(val / divisor, divisor)
        : val;
}

使用示例:

let result = largestPrimeFactor(600851475143);

这是代码示例

于 2016-04-01T15:54:37.850 回答
8

类似于@Triptych 的答案,但也不同。在此示例中,未使用列表或字典。代码是用 Ruby 编写的

def largest_prime_factor(number)
  i = 2
  while number > 1
    if number % i == 0
      number /= i;
    else
      i += 1
    end
  end
  return i
end

largest_prime_factor(600851475143)
# => 6857
于 2018-02-19T08:53:03.017 回答
4

最简单的解决方案是一对相互递归的函数。

第一个函数生成所有素数:

  1. 从所有大于 1 的自然数列表开始。
  2. 删除所有不是素数的数字。也就是说,没有素因数的数字(除了它们自己)。见下文。

第二个函数n按递增顺序返回给定数字的质因数。

  1. 列出所有素数(见上文)。
  2. 删除所有不是 的因数的数字n

的最大素n数是第二个函数给出的最后一个数。

该算法需要惰性列表或具有按需调用语义的语言(或数据结构) 。

为了澄清起见,这里是 Haskell 中上述的一个(低效)实现:

import Control.Monad

-- All the primes
primes = 2 : filter (ap (<=) (head . primeFactors)) [3,5..]

-- Gives the prime factors of its argument
primeFactors = factor primes
  where factor [] n = []
        factor xs@(p:ps) n =
          if p*p > n then [n]
          else let (d,r) = divMod n p in
            if r == 0 then p : factor xs d
            else factor ps n

-- Gives the largest prime factor of its argument
largestFactor = last . primeFactors

让它更快只是更聪明地检测哪些数字是素数和/或因子的问题n,但算法保持不变。

于 2008-10-28T04:42:40.770 回答
4

所有数字都可以表示为素数的乘积,例如:

102 = 2 x 3 x 17
712 = 2 x 2 x 2 x 89

您可以通过简单地从 2 开始并简单地继续除直到结果不是您的数字的倍数来找到这些:

712 / 2 = 356 .. 356 / 2 = 178 .. 178 / 2 = 89 .. 89 / 89 = 1

使用这种方法,您不必实际计算任何素数:它们都将是素数,基于您已经将数字与所有前面的数字尽可能地分解的事实。

number = 712;
currNum = number;    // the value we'll actually be working with
for (currFactor in 2 .. number) {
    while (currNum % currFactor == 0) {
        // keep on dividing by this number until we can divide no more!
        currNum = currNum / currFactor     // reduce the currNum
    }
    if (currNum == 1) return currFactor;    // once it hits 1, we're done.
}
于 2008-10-28T05:06:53.013 回答
4
    //this method skips unnecessary trial divisions and makes 
    //trial division more feasible for finding large primes

    public static void main(String[] args) 
    {
        long n= 1000000000039L; //this is a large prime number 
        long i = 2L;
        int test = 0;

        while (n > 1)
        {
            while (n % i == 0)
            {
                n /= i;     
            }

            i++;

            if(i*i > n && n > 1) 
            {
                System.out.println(n); //prints n if it's prime
                test = 1;
                break;
            }
        }

        if (test == 0)  
            System.out.println(i-1); //prints n if it's the largest prime factor
    }
于 2014-04-11T13:18:50.080 回答
3
n = abs(number);
result = 1;
if (n mod 2 == 0) {
 result = 2;
 while (n mod 2 = 0) n /= 2;
}
for(i=3; i<sqrt(n); i+=2) {
 if (n mod i == 0) {
   result = i;
   while (n mod i = 0)  n /= i;
 }
}
return max(n,result)

有一些模检验是多余的,因为如果所有因素 2 和 3 都已删除,则 n 永远不能除以 6。您只能允许 i 使用素数,这在此处的其他几个答案中有所显示。

您实际上可以在这里交织 Eratosthenes 的筛子:

  • 首先创建整数列表,直到sqrt(n).
  • 在 for 循环中,将 i 到 new 的所有倍数标记sqrt(n)为非质数,并改用 while 循环。
  • 将 i 设置为列表中的下一个素数。

另请参阅此问题

于 2008-10-14T19:08:35.213 回答
2

我知道这不是一个快速的解决方案。发布为希望更容易理解缓慢的解决方案。

 public static long largestPrimeFactor(long n) {

        // largest composite factor must be smaller than sqrt
        long sqrt = (long)Math.ceil(Math.sqrt((double)n));

        long largest = -1;

        for(long i = 2; i <= sqrt; i++) {
            if(n % i == 0) {
                long test = largestPrimeFactor(n/i);
                if(test > largest) {
                    largest = test;
                }
            }
        }

        if(largest != -1) {
            return largest;
        }

        // number is prime
        return n;
    } 
于 2012-02-27T22:41:54.750 回答
1

通过从数字中删除所有素因子的 Python 迭代方法

def primef(n):
    if n <= 3:
        return n
    if n % 2 == 0:
        return primef(n/2)
    elif n % 3 ==0:
        return primef(n/3)
    else:
        for i in range(5, int((n)**0.5) + 1, 6):
            #print i
            if n % i == 0:
                return primef(n/i)
            if n % (i + 2) == 0:
                return primef(n/(i+2))
    return n
于 2015-11-09T12:55:37.033 回答
1

我正在使用算法,该算法继续将数字除以当前的主要因子。

我在 python 3 中的解决方案:

def PrimeFactor(n):
    m = n
    while n%2==0:
        n = n//2
    if n == 1:         # check if only 2 is largest Prime Factor 
        return 2
    i = 3
    sqrt = int(m**(0.5))  # loop till square root of number
    last = 0              # to store last prime Factor i.e. Largest Prime Factor
    while i <= sqrt :
        while n%i == 0:
            n = n//i       # reduce the number by dividing it by it's Prime Factor
            last = i
        i+=2
    if n> last:            # the remaining number(n) is also Factor of number 
        return n
    else:
        return last
print(PrimeFactor(int(input()))) 

输入:10 输出:5

输入:600851475143 输出:6857

于 2016-09-01T06:08:06.190 回答
1

受您的问题的启发,我决定在 Python 中实现我自己的因式分解(并找到最大的素数)版本。

我所知道的最容易实现但非常有效的因式分解算法可能是Pollard 的 Rho算法。它的运行时间最多为 ,比试除算法O(N^(1/4))的时间快得多。O(N^(1/2))两种算法只有在复合(非素数)数的情况下才有这些运行时间,这就是为什么应该使用素数测试来过滤掉素数(不可因数)。

我在我的代码中使用了以下算法:Fermat Primality Test ...、 Pollard's Rho Algorithm ...、 Trial Division Algorithm。在运行 Pollard 的 Rho 之前使用 Fermat 素数测试以过滤掉素数。Trial Division 被用作后备,因为 Pollard 的 Rho 在极少数情况下可能无法找到因素,尤其是对于一些小数字。

显然,在将一个数字完全分解为已排序的素因子列表后,最大的素因子将是该列表中的最后一个元素。在一般情况下(对于任何随机数),除了完全分解一个数字之外,我不知道有任何其他方法可以找出最大的素数。

作为我的代码中的一个示例,我正在分解 Pi 的前190个小数位,代码在 1 秒内分解这个数字,并显示最大的素数因子,其大小为165位(545 位)!

在线尝试!

def is_fermat_probable_prime(n, *, trials = 32):
    # https://en.wikipedia.org/wiki/Fermat_primality_test
    import random
    if n <= 16:
        return n in (2, 3, 5, 7, 11, 13)
    for i in range(trials):
        if pow(random.randint(2, n - 2), n - 1, n) != 1:
            return False
    return True

def pollard_rho_factor(N, *, trials = 16):
    # https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
    import random, math
    for j in range(trials):
        i, stage, y, x = 0, 2, 1, random.randint(1, N - 2)
        while True:
            r = math.gcd(N, x - y)
            if r != 1:
                break
            if i == stage:
                y = x
                stage <<= 1
            x = (x * x + 1) % N
            i += 1
        if r != N:
            return [r, N // r]
    return [N] # Pollard-Rho failed

def trial_division_factor(n, *, limit = None):
    # https://en.wikipedia.org/wiki/Trial_division
    fs = []
    while n & 1 == 0:
        fs.append(2)
        n >>= 1
    d = 3
    while d * d <= n and limit is None or d <= limit:
        q, r = divmod(n, d)
        if r == 0:
            fs.append(d)
            n = q
        else:
            d += 2
    if n > 1:
        fs.append(n)
    return fs

def factor(n):
    if n <= 1:
        return []
    if is_fermat_probable_prime(n):
        return [n]
    fs = trial_division_factor(n, limit = 1 << 12)
    if len(fs) >= 2:
        return sorted(fs[:-1] + factor(fs[-1]))
    fs = pollard_rho_factor(n)
    if len(fs) >= 2:
        return sorted([e1 for e0 in fs for e1 in factor(e0)])
    return trial_division_factor(n)

def demo():
    import time, math
    # http://www.math.com/tables/constants/pi.htm
    # pi = 3.
    #     1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679
    #     8214808651 3282306647 0938446095 5058223172 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196
    # n = first 190 fractional digits of Pi
    n =   1415926535_8979323846_2643383279_5028841971_6939937510_5820974944_5923078164_0628620899_8628034825_3421170679_8214808651_3282306647_0938446095_5058223172_5359408128_4811174502_8410270193_8521105559_6446229489
    print('Number:', n)
    tb = time.time()
    fs = factor(n)
    print('All Prime Factors:', fs)
    print('Largest Prime Factor:', f'({math.log2(fs[-1]):.02f} bits, {len(str(fs[-1]))} digits)', fs[-1])
    print('Time Elapsed:', round(time.time() - tb, 3), 'sec')

if __name__ == '__main__':
    demo()

输出:

Number: 1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489
All Prime Factors: [3, 71, 1063541, 153422959, 332958319, 122356390229851897378935483485536580757336676443481705501726535578690975860555141829117483263572548187951860901335596150415443615382488933330968669408906073630300473]
Largest Prime Factor: (545.09 bits, 165 digits) 122356390229851897378935483485536580757336676443481705501726535578690975860555141829117483263572548187951860901335596150415443615382488933330968669408906073630300473
Time Elapsed: 0.593 sec
于 2021-08-31T09:24:51.313 回答
0

这是我在 c# 中的尝试。最后的打印输出是数字的最大素数。我检查了一下,它有效。

namespace Problem_Prime
{
  class Program
  {
    static void Main(string[] args)
    {
      /*
       The prime factors of 13195 are 5, 7, 13 and 29.

      What is the largest prime factor of the number 600851475143 ?
       */
      long x = 600851475143;
      long y = 2;
      while (y < x)
      {
        if (x % y == 0)
        {
          // y is a factor of x, but is it prime
          if (IsPrime(y))
          {
            Console.WriteLine(y);
          }
          x /= y;
        }

        y++;

      }
      Console.WriteLine(y);
      Console.ReadLine();
    }
    static bool IsPrime(long number)
    {
      //check for evenness
      if (number % 2 == 0)
      {
        if (number == 2)
        {
          return true;
        }
        return false;
      }
      //don't need to check past the square root
      long max = (long)Math.Sqrt(number);
      for (int i = 3; i <= max; i += 2)
      {
        if ((number % i) == 0)
        {
          return false;
        }
      }
      return true;
    }

  }
}
于 2014-01-20T15:54:25.800 回答
0
#python implementation
import math
n = 600851475143
i = 2
factors=set([])
while i<math.sqrt(n):
   while n%i==0:
       n=n/i
       factors.add(i)
   i+=1
factors.add(n)
largest=max(factors)
print factors
print largest
于 2014-05-31T20:57:01.140 回答
0

在 C++ 中使用递归计算数字的最大素数。代码的工作解释如下:

int getLargestPrime(int number) {
    int factor = number; // assumes that the largest prime factor is the number itself
    for (int i = 2; (i*i) <= number; i++) { // iterates to the square root of the number till it finds the first(smallest) factor
        if (number % i == 0) { // checks if the current number(i) is a factor
            factor = max(i, number / i); // stores the larger number among the factors
            break; // breaks the loop on when a factor is found
        }
    }
    if (factor == number) // base case of recursion
        return number;
    return getLargestPrime(factor); // recursively calls itself
}
于 2014-07-12T15:33:08.947 回答
0

这是我快速计算最大素数的方法。它基于修饰x不包含非主要因素的事实。为了实现这一点,我们x会在找到一个因素后立即进行划分。然后,唯一剩下的就是返回最大的因子。它已经是主要的了。

代码(哈斯克尔):

f max' x i | i > x = max'
           | x `rem` i == 0 = f i (x `div` i) i  -- Divide x by its factor
           | otherwise = f max' x (i + 1)  -- Check for the next possible factor

g x = f 2 x 2
于 2015-11-22T12:23:26.427 回答
0

以下 C++ 算法不是最好的,但它适用于十亿以下的数字,而且速度非常快

#include <iostream>
using namespace std;

// ------ is_prime ------
// Determines if the integer accepted is prime or not
bool is_prime(int n){
    int i,count=0;
    if(n==1 || n==2)
      return true;
    if(n%2==0)
      return false;
    for(i=1;i<=n;i++){
    if(n%i==0)
        count++;
    }
    if(count==2)
      return true;
    else
      return false;
 }
 // ------ nextPrime -------
 // Finds and returns the next prime number
 int nextPrime(int prime){
     bool a = false;
     while (a == false){
         prime++;
         if (is_prime(prime))
            a = true;
     }
  return prime;
 }
 // ----- M A I N ------
 int main(){

      int value = 13195;
      int prime = 2;
      bool done = false;

      while (done == false){
          if (value%prime == 0){
             value = value/prime;
             if (is_prime(value)){
                 done = true;
             }
          } else {
             prime = nextPrime(prime);
          }
      }
        cout << "Largest prime factor: " << value << endl;
 }
于 2016-06-15T07:56:40.273 回答
0

“James Wang”在网上找到了这个解决方案

public static int getLargestPrime( int number) {

    if (number <= 1) return -1;

    for (int i = number - 1; i > 1; i--) {
        if (number % i == 0) {
            number = i;
        }
    }
    return number;
}
于 2018-07-18T20:57:03.717 回答
0

使用筛子的素因子:

#include <bits/stdc++.h>
using namespace std;
#define N 10001  
typedef long long ll;
bool visit[N];
vector<int> prime;

void sieve()
{
            memset( visit , 0 , sizeof(visit));
            for( int i=2;i<N;i++ )
            {
                if( visit[i] == 0)
                {
                    prime.push_back(i);
                    for( int j=i*2; j<N; j=j+i )
                    {
                        visit[j] = 1;
                    }
                }
            }   
}
void sol(long long n, vector<int>&prime)
{
            ll ans = n;
            for(int i=0; i<prime.size() || prime[i]>n; i++)
            {
                while(n%prime[i]==0)
                {
                    n=n/prime[i];
                    ans = prime[i];
                }
            }
            ans = max(ans, n);
            cout<<ans<<endl;
}
int main() 
{
           ll tc, n;
           sieve();

           cin>>n;
           sol(n, prime);

           return 0;
}
于 2018-09-13T10:41:37.950 回答
0

这是我在 Clojure 中的尝试。只为主要因素走赔率prime?和素数,即。sieve. 使用惰性序列有助于在需要它们之前生成值。

(defn prime? 
  ([n]
    (let [oddNums (iterate #(+ % 2) 3)]
    (prime? n (cons 2 oddNums))))
  ([n [i & is]]
    (let [q (quot n i)
          r (mod n i)]
    (cond (< n 2)       false
          (zero? r)     false
          (> (* i i) n) true
          :else         (recur n is)))))

(def primes 
  (let [oddNums (iterate #(+ % 2) 3)]
  (lazy-seq (cons 2 (filter prime? oddNums)))))

;; Sieve of Eratosthenes
(defn sieve
  ([n] 
    (sieve primes n))
  ([[i & is :as ps] n]
    (let [q (quot n i)
          r (mod n i)]
    (cond (< n 2)       nil
          (zero? r)     (lazy-seq (cons i (sieve ps q)))
          (> (* i i) n) (when (> n 1) (lazy-seq [n]))
          :else         (recur is n)))))

(defn max-prime-factor [n]
  (last (sieve n)))
于 2021-02-27T21:52:19.057 回答
0

猜猜,除了执行分解之外没有直接的方法,就像上面的例子所做的那样,即

在迭代中,您确定数字N的“小”因子f,然后继续简化问题“找到N':=N/f的最大素因子,因子候选>=f ”。

f的某个大小开始,如果您对减少的 N'进行素性测试,那么预期的搜索时间会更短,以防万一,您的N'已经是初始N的最大素数。

于 2021-04-03T18:18:37.330 回答
-1

在我看来,给出的算法的第 2 步不会是一种有效的方法。你没有合理的期望它是素数。

此外,先前暗示埃拉托色尼筛法的答案是完全错误的。我刚刚编写了两个程序来分解 123456789。一个基于 Sieve,一个基于以下内容:

1)  Test = 2 
2)  Current = Number to test 
3)  If Current Mod Test = 0 then  
3a)     Current = Current Div Test 
3b)     Largest = Test
3c)     Goto 3. 
4)  Inc(Test) 
5)  If Current < Test goto 4
6)  Return Largest

这个版本比 Sieve 快 90 倍。

问题是,在现代处理器上,操作类型的重要性远低于操作数量,更不用说上面的算法可以在缓存中运行,而 Sieve 则不能。Sieve 使用了很多操作来剔除所有的合数。

另请注意,我在确定因素时将它们分开会减少必须测试的空间。

于 2008-10-28T05:40:45.487 回答
-1

首先计算一个存储素数的列表,例如 2 3 5 7 11 13 ...

每次对一个数进行质数分解时,请使用 Triptych 的实现,但迭代这个质数列表而不是自然整数。

于 2013-11-07T23:09:49.147 回答
-1

使用 Java:

对于int值:

public static int[] primeFactors(int value) {
    int[] a = new int[31];
    int i = 0, j;
    int num = value;
    while (num % 2 == 0) {
        a[i++] = 2;
        num /= 2;
    }
    j = 3;
    while (j <= Math.sqrt(num) + 1) {
        if (num % j == 0) {
            a[i++] = j;
            num /= j;
        } else {
            j += 2;
        }
    }
    if (num > 1) {
        a[i++] = num;
    }
    int[] b = Arrays.copyOf(a, i);
    return b;
}

对于long值:

static long[] getFactors(long value) {
    long[] a = new long[63];
    int i = 0;
    long num = value;
    while (num % 2 == 0) {
        a[i++] = 2;
        num /= 2;
    }
    long j = 3;
    while (j <= Math.sqrt(num) + 1) {
        if (num % j == 0) {
            a[i++] = j;
            num /= j;
        } else {
            j += 2;
        }
    }
    if (num > 1) {
        a[i++] = num;
    }
    long[] b = Arrays.copyOf(a, i);
    return b;
}
于 2014-03-28T21:07:05.247 回答
-3

这可能并不总是更快,但更乐观的是你找到了一个大的主要除数:

  1. N是你的号码
  2. 如果它是素数return(N)
  3. 计算素数直到Sqrt(N)
  4. 按降序遍历素数(最大的在前)
    • 如果N is divisible by Prime那时Return(Prime)

编辑:在第 3 步中,您可以使用 Eratosthenes 筛或阿特金斯筛或任何您喜欢的筛子,但筛子本身不会为您找到最大的主要因素。(这就是为什么我不会选择 SQLMenace 的帖子作为官方答案的原因......)

于 2008-08-27T20:45:14.827 回答
-3

这里是作为生成器提供的同样的函数@Triptych,它也被稍微简化了。

def primes(n):
    d = 2
    while (n > 1):
        while (n%d==0):
            yield d
            n /= d
        d += 1

然后可以使用以下方法找到最大素数:

n= 373764623
max(primes(n))

以及使用以下方法找到的因素列表:

list(primes(n))
于 2013-05-16T18:56:12.553 回答
-5

我认为最好将所有可能的素数都存储在小于 n 的地方,然后遍历它们以找到最大的除数。您可以从prime-numbers.org获得素数。

当然我假设你的数字不是太大:)

于 2008-08-22T19:57:15.860 回答
-6
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include <time.h>

factor(long int n)
{
long int i,j;
while(n>=4)
 {
if(n%2==0) {  n=n/2;   i=2;   }

 else
 { i=3;
j=0;
  while(j==0)
  {
   if(n%i==0)
   {j=1;
   n=n/i;
   }
   i=i+2;
  }
 i-=2;
 }
 }
return i;
 }

 void main()
 { 
  clock_t start = clock();
  long int n,sp;
  clrscr();
  printf("enter value of n");
  scanf("%ld",&n);
  sp=factor(n);
  printf("largest prime factor is %ld",sp);

  printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
  getch();
 }
于 2011-10-08T17:23:59.783 回答