Skip to main content
Code Review

Return to Question

replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

Tweeted twitter.com/StackCodeReview/status/747103691556200448
added 197 characters in body
Source Link
Phrancis
  • 20.5k
  • 6
  • 69
  • 155

Largest Prime Factor (PE3) inusing OOP style

I'm also not that great at math at the moment, if you know of edge cases that I may have missed with the calculations below, please let me know so I can improve my math knowledge a bit as well!

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

Largest Prime Factor (PE3) in OOP style

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

Largest Prime Factor (PE3) using OOP

I'm also not that great at math at the moment, if you know of edge cases that I may have missed with the calculations below, please let me know so I can improve my math knowledge a bit as well!

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

Source Link
Phrancis
  • 20.5k
  • 6
  • 69
  • 155

Largest Prime Factor (PE3) in OOP style

I want to learn some C# syntax/paradigms (I'm more used to Java), and have been wanting to get a bit better at math as well, so I solved ProjectEuler3: Largest prime factor with the following small program in LINQPad. It gives the correct answer and completes in 0.05s-0.08s.

For reference, here is the problem statement:

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

All feedback welcomed. In particular, are there some C# mistakes I am making or features I am missing on due to being very new at it?

P.S.: Note the BigNumbersUtils.Sqrt extension method comes from this Stack Overflow answer. I am excluding it since it is not my code. it gives the same result as Math.Sqrt but for BigInteger type.

void Main()
{
 Console.WriteLine("ProjectEuler3: Largest prime factor");
 BigInteger testCase = 600851475143;
 ProjectEuler3 PE3 = new ProjectEuler3(testCase);
 Console.WriteLine("Prime factor of {0} is: {1}", testCase, PE3.GetAnswer());
}
class ProjectEuler3
{
 private BigInteger number;
 
 public ProjectEuler3(BigInteger number)
 {
 this.number = number;
 }
 
 public BigInteger GetAnswer()
 {
 // largest possible prime factor of a number is its square root [citation needed]
 BigInteger maxPrimeFactor = BigNumbersUtils.Sqrt(number);
 // make sure number we start from is odd, as even numbers are never going to be prime
 if (maxPrimeFactor % 2 == 0) { maxPrimeFactor += 1; }
 // iterating by 2s to skip even numbers
 for (BigInteger i = maxPrimeFactor; i >= 1; i = i - 2)
 {
 if (IsFactor(i, number) && IsPrime(i))
 {
 return i;
 }
 }
 return 1;
 }
 
 private bool IsFactor(BigInteger n, BigInteger factorOf)
 {
 return (factorOf % n == 0) ? true : false;
 }
 
 private bool IsPrime(BigInteger n)
 // Based on Wikipedia page for "Primality test"
 // https://en.wikipedia.org/wiki/Primality_test#Simple_methods
 {
 // short-circuit very common numbers
 if (n <= 1)
 {
 return false;
 }
 else if (n <= 3) 
 {
 return true;
 } 
 else if (n % 2 == 0 || n % 3 ==0)
 {
 return false;
 }
 else if ( (n != 5 && n % 5 == 0))
 {
 return false;
 }
 // iterate with trial division
 BigInteger i = 5;
 while (i * i <= n)
 {
 if (n % i == 0 || n % (i + 2) == 0)
 {
 return false;
 }
 i++;
 }
 return true;
 }
 
}
lang-cs

AltStyle によって変換されたページ (->オリジナル) /