簡體   English   中英

C#,找到一個數字的最大素數因子

[英]C#, finding the largest prime factor of a number

我是編程新手,我正在練習C#編程技巧。 我的應用程序旨在找到用戶輸入的數字的最大素數因子。 但我的應用程序沒有返回正確的答案,我真的不知道問題出在哪里。 你能幫我么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Calcular máximo factor primo de n. De 60 es 5.");
            Console.Write("Escriba un numero: ");
            long num = Convert.ToInt64(Console.ReadLine());
            long mfp = maxfactor(num);
            Console.WriteLine("El maximo factor primo es: " + num);
            Console.Read();
        }
        static private long maxfactor (long n)
        {
            long m=1 ;
            bool en= false;
            for (long k = n / 2; !en && k > 1; k--)
            {
                if (n % k == 0 && primo(k))
                {
                    m = k;
                    en = true;
                }
            }
            return m;

        }
        static private bool primo(long x)
        {
            bool sp = true;
            for (long i = 2; i <= x / 2; i++)
            {
                if (x % i == 0)
                    sp = false;
            }
            return sp;
        }
    }
}

在殘留物為素數之前,去除小因子會快得多。

static private long maxfactor (long n)
{
    long k = 2;
    while (k * k <= n)
    {
        if (n % k == 0)
        {
            n /= k;
        }
        else
        {
            ++k;
        }
    }

    return n;
}

例如,如果n = 784,則執行9次模運算而不是數百次運算。 即使使用sqrt限制,倒計時仍會在maxfactor中執行21個模運算,而在primo中執行另外12個模運算。

這里有更新的優化版本

Console.WriteLine("El maximo factor primo es: " + mfp);

代替

Console.WriteLine("El maximo factor primo es: " + num);

你有條件(!en)使它只迭代直到第一個素數因子。 您還可以將界限從n / 2減少到sqrt(n)+1

Catalin DICU已經回答了你的問題,但你的代碼中有一些非慣用的構造,你應該看看重構。 例如,在你的maxfactor方法中,你不需要“en”條件,只要你找到它就立即返回值:

static private long maxfactor (long n)
{
    for (long k = n / 2; k > 1; k--)
    {
        if (n % k == 0 && primo(k))
        {
            return k;
        }
    }

    // no factors found
    return 1;
}

類似地,對於primo方法,只要找到一個因子,就可以返回false

這是af#版本:

let lpf n =
    let rec loop n = function        
        |k when k*k >= n -> n
        |k when n % k = 0I -> loop (n/k) k
        |k -> loop n (k+1I)
    loop n 2I

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM