/* The Sieve of Eratosthenes implemented in C++

 * Robin Broad

 * November 2008

 * Part of a project to demonstrate an ability to

 * implement an algorithm in a range of different

 * computing languages and to use a range of

 * compilers, including the following:

 *

 * Java: BlueJ

 * C: Miracle C

 * C++: Microsoft Visual C++.NET

 * C#: Microsoft Visual C#.NET

 * Visual Basic: Microsoft Visual Basic.NET

 */

 

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;

#include <math.h>

#define RANGE 1000  //we are calculating the prime numbers up to this number

 

int _tmain()

{

    //variable declarations

    int listOfIntegers[RANGE+1];//This array of integers will hold all the numbers up to the value of RANGE

    int root=(int)sqrt((double)RANGE);//needed later on when removing multiples, casting is used since we're

                                      //only interested in integer values

    int product=0;//used later when removing multiples

    int printCount=0;//used during print formatting of the program output

    int n,multiplier=0;//used a loop counter

                                               

    //initialising the integer array

    for(n=1; n<=RANGE; n++)listOfIntegers[n]=n;

       

    //starting from n=2, "remove" multiples of n up the value of RANGE

    //repeat for increasing values of n up to the square root of RANGE

    for(n=2; n<=root; n++)

    {

        //delete the multiples of n

        for(multiplier=2; multiplier*n<=RANGE; multiplier++)

        {

            product=n*multiplier;

            listOfIntegers[product]=0;

        }

    }//end of multiple removal

   

    //print out the prime numbers remaining, remembering that 2 is the first prime number

    Console::Write("The Sieve of Eratosthenes program\n");

    Console::Write("Written in C++ and compiled using Microsoft Visual C++\n");

    Console::Write("Robin Broad, November 2008.\n");

        Console::WriteLine(S"The prime numbers in the range: 1 to {0,4} are:-", __box(RANGE));

       

    for(n=2; n<=RANGE; n++)

    {

        //print all non-zero elements of the integer array in blocks of 10 numbers at a time

        if (listOfIntegers[n]!=0)

        {

                        Console::Write(S"{0,4}\t", __box(listOfIntegers[n]));

            printCount++;

            if(printCount%10==0)Console::Write("\n");//every 10 items produces a new line

        }

    }

        Console::WriteLine("\n\nEnd of program.\n");

    getchar();      

}//end of main

 

//Robin Broad, November 2008

 

/*

 *This program produced the following output:

 

The Sieve of Eratosthenes program

Written in C++ and compiled using Microsoft Visual C++

Robin Broad, November 2008.

The prime numbers in the range: 1 to 1000 are:-

   2       3       5       7      11      13      17      19      23      29

 

  31      37      41      43      47      53      59      61      67      71

 

  73      79      83      89      97     101     103     107     109     113

 

 127     131     137     139     149     151     157     163     167     173

 

 179     181     191     193     197     199     211     223     227     229

 

 233     239     241     251     257     263     269     271     277     281

 

 283     293     307     311     313     317     331     337     347     349

 

 353     359     367     373     379     383     389     397     401     409

 

 419     421     431     433     439     443     449     457     461     463

 

 467     479     487     491     499     503     509     521     523     541

 

 547     557     563     569     571     577     587     593     599     601

 607     613     617     619     631     641     643     647     653     659

 

 661     673     677     683     691     701     709     719     727     733

 

 739     743     751     757     761     769     773     787     797     809

 

 811     821     823     827     829     839     853     857     859     863

 

 877     881     883     887     907     911     919     929     937     941

 

 947     953     967     971     977     983     991     997

 

End of program.

 

 */