[英]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.