Click here to Skip to main content
Click here to Skip to main content

Tagged as

Go to top

Find Prime Numbers in C# Using the Sieve of Eratosthenes

, 3 Oct 2011
Rate this:
Please Sign up or sign in to vote.
This tip illustrates a simple C# console program that uses the Sieve of Eratosthenes algorithm to quickly find prime numbers.
Ever been tasked to come up with lists of prime numbers and you want to use the Sieve of Eratosthenes[^] to do so, but aren't quite sure how to code it up in C#? If so, then this simple console program written with .NET should do the trick:
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace PrimeFinder
{
    class Program
    {
        static void Main(string[] args)
        {
            // this method encodes the Sieve of Eratosthenes
            // with some intelligent shortcuts, such as excluding
            // all even numbers greater than 2 etc.
            try
            {
                List<string> outputLines = new List<string>();
 
                // read in the numbers specified in the argument
                string[] numbersList = File.ReadAllLines(args[0]);
                foreach(string number in numbersList) {
                    int N = Int32.Parse(number);
                    List<int> primeCandidates = new List<int>(N);
                    if (N==2)
                    {
                        outputLines.Add("2\r\n");  // trivial case
                        continue;
                    }
                    if (N==1)
                    {
                        throw new InvalidArgumentException("The number one is trivially prime.");
                    }
 
                    // initialize primeCandidates with 2 
                    // and the list of all odd numbers
                    // less than N -- because all even numbers 
                    // save 2 are nonprime by definition
                    primeCandidates.Add(2); // the number 2 is always prime
                    for (int i = 2; i <= (N+1)/2; i++)
                        primeCandidates.Add(2*i-1);
 
                    for(int j = 0;j < primeCandidates.Count;++j) {
                        // initialize first prime
                        int prime = primeCandidates[j];
 
                        // use for loop to go through the multiples of the prime
                        for( int multiple = 2;multiple*prime <= N;++multiple) {
                            if (prime == 2) break; // duh, 2 is a prime

                            // skip all even multiples of 2
                            if ((multiple * prime) % 2 == 0) 
                               continue;                              
 
                            // don't bother removing an item that 
                            // is not even in the list
                            if (!primeCandidates.Contains(multiple * prime)) 
                               continue;  
 
                            primeCandidates.Remove(multiple * prime);
                        }
                    }
 
                    // put together a string representing 
                    // current output line of primes
                    string currentOutputLine = string.Empty;
                    foreach (int value in primeCandidates)
                        currentOutputLine += value.ToString() + ',';
                    currentOutputLine = 
                       currentOutputLine.Remove(currentOutputLine.Length - 1);
                    currentOutputLine += "\r\n"; // Windows CRLF encoding

                    Console.Write(currentOutputLine);
 
                    // write a line to the output file for 
                    // each list of prime
                    // candidates generated
                    outputLines.Add(currentOutputLine);
                }
 
                File.WriteAllLines(args[1], outputLines);
 
                Console.WriteLine("DONE computing primes");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Brian C Hart
Software Developer (Senior) Corrugated Technologies, Inc.
United States United States
From Fridley, Minnesota and I like computer programming! When I got started, I was working mostly with Windows GUI programming in C/C++. Then later on I worked with COM/DCOM for a school internship. I used COM/DCOM to write an ad hoc cluster server and job-running environment for a cluster of 24 Windows-based high-end visualization workstations. I moved on to C# and have been working in C# and Windows Forms ever since. I have yet to embrace Silverlight Smile | :)
Follow on   Twitter

Comments and Discussions

 
GeneralMy vote of 5 Pinmemberlong_cloud31-Mar-13 4:56 
GeneralAnother alternative. PinmemberBill Anderson28-Dec-12 12:27 
Generalvery nice .. Pinmemberdineshkummarc17-Nov-11 23:31 
GeneralReason for my vote of 5 Loved it... PinmemberGPUToaster™12-Sep-11 23:33 
GeneralReason for my vote of 5 Nice concept... PinmemberPravin Patil, Mumbai12-Sep-11 8:21 
GeneralEdit: Added wiki link to the sieve definition for those who ... PinmentorDaveAuld11-Sep-11 10:23 
GeneralRe: Edit: Fixed the link PinmemberReiss12-Sep-11 0:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.140916.1 | Last Updated 3 Oct 2011
Article Copyright 2011 by Brian C Hart
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid