Count prime numbers in a range (C# Solution)
Problem: Given a range of integers, count the number of primes. Also list the prime numbers in the range.
using System;
namespace SolvingSmallProblems
{
public class Program
{
static void Main(string[] args)
{
int defaultLowNum = 1;
int defaultHighNum = 50;
int lowNum, highNum;
PrimeNumberPuzzles prime = new PrimeNumberPuzzles();
Console.WriteLine("PRIME NUMBER COUNT PROGRAM");
Console.WriteLine();
Console.WriteLine("Please enter start number");
try
{
lowNum =
Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
lowNum = defaultLowNum;
}
Console.WriteLine("Please enter end number");
try
{
highNum = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
highNum = defaultHighNum;
}
if (lowNum < 1)
{
lowNum = defaultLowNum;
}
if (highNum < lowNum)
{
highNum = defaultHighNum;
}
int totalPrimes = prime.CountPrimes(lowNum, highNum);
Console.WriteLine();
Console.WriteLine("Total number of prime numers between " +
lowNum.ToString() + " and " + highNum.ToString() +
" is " + totalPrimes + ".");
Console.ReadKey();
}
}
public class PrimeNumberPuzzles
{
public int CountPrimes(int low, int high)
{
int count = 0;
for (int num = low; num <= high; num++)
{
if (IsPrime(num))
{
Console.Write(num + " ");
count++;
}
}
return count;
}
bool IsPrime(int num)
{
bool isNumPrime = true;
if ( num == 2)
{
return true;
}
else if (num == 1)
{
return false;
}
else if (num < 1)
{
throw new Exception("Invalid number!");
}
else
{
int remainder;
for (int test = 2; test < num - 1; test++)
{
remainder = num % test;
if (remainder == 0)
{
isNumPrime = false;
}
}
return isNumPrime;
}
}
}
}
test < num – 1? Don’t you mean test < (num/2)? Your loop is doing much more work than it needs to.
Marco Casalaina
April 16, 2008 at 2:28 pm
Marco: You are right. However, for a large n, n/2 and n-1 will both give O(n). Thanks for the comment.
Arsalan
April 16, 2008 at 3:01 pm