Sieve Program
C and Java Side-by-side


Differences between C and Java: This page presents the algorithm that uses the "Sieve of Eratosthenes" to calculate all prime numbers less than 2000.

For a great poem about sieves, see The Jumblies, by Edgar Lear.

Here are two implementations side-by-side, with C on the left and Java on the right. Differences between the programs are highlighted in red.

C Sieve Program Equivalent Java Sieve Program

/*--------- File: sieve.h -------------------*/
void makesieve(int p[], int len);
void printsieve(const int p[], int len);
void printprimes(const int p[], int len);
/*--------- File: sieve.c -------------------*/
#include <stdio.h>
#include "sieve.h"

static void initializesieve(int p[], int len) {
   int i;
   p[0] = 0;
   p[1] = 0;

   for (i = 2; i < len; i++)
      p[i] = 1;
}

static void one(int p[], int len, int prime) {
   int i;
   for (i = 2*prime; i < len; i = i + prime)
      p[i] = 0;
}

void makesieve(int p[], int len) {
   int i;
   initializesieve(p, len);
   for (i = 2; i*i < len; i++)
      if (p[i] == 1)
           one(p, len, i);
}

void printsieve(const int p[], int len) {
   int i;
   printf("Sieve follows:");
   for (i = 0; i < len; i++) {
      if (i%100 == 0)
         printf("\n");
      printf("%d", p[i]);
   }
   printf("\n");
}

void printprimes(const int p[], int len) {
   int i;
   int count = 0;
   printf("Primes follow:");
   for (i = 0; i < len; i++) {
      if (p[i] == 1) {
         if (count%10 == 0)
             printf("\n");
         printf("%d\t",i);
         count++;
      }
   }
   printf("\n");
}

/*--------- File: sievemain.c ---------------*/
#include <stdio.h>
#include "sieve.h"
#define SIZE 2000

int main() {
   int list[SIZE];
   int listsize = SIZE;

   makesieve(list, listsize);
   printsieve(list, listsize);
   printprimes(list, listsize);
   return 0;
}





/*--------- File: Sieve.java ----------------*/
public class Sieve {


   private static void initializeSieve(int[] p, int len) {
      
      p[0] = 0;
      p[1] = 0;

      for (int i = 2; i < len; i++)
         p[i] = 1;
   }

   private static void one(int[] p, int len, int prime) {

      for (int i = 2*prime; i < len; i = i + prime)
         p[i] = 0;
   }

   public static void makeSieve(int[] p, int len) {

      initializeSieve(p, len);
      for (int i = 2; i*i < len; i++)
         if (p[i] == 1)
            one(p, len, i);
   }

   public static void printSieve(int[] p, int len) {

      System.out.print("Sieve follows:");
      for (int i = 0; i < len; i++) {
         if (i%100 == 0)
            System.out.println();
         System.out.print(p[i]);
      }
      System.out.println();
   }

   public static void printPrimes(int[] p, int len) {
      int count = 0;

      System.out.print("Primes follow:");
      for (int i = 0; i < len; i++) {
         if (p[i] == 1) {
            if (count%10 == 0)
                System.out.println();
            System.out.print(i + "\t");
            count++;
         }
      }
      System.out.println();
   }
}
/*--------- File: SieveMain.java ------------*/
public class SieveMain {

   final static int SIZE = 2000;
   static int[] list = new int[SIZE];

   public static void main(String[] args) {
      int listSize = SIZE;

      Sieve.makeSieve(list, listSize);
      Sieve.printSieve(list, listSize);
      Sieve.printPrimes(list, listSize);
   }
}
Common Output
Sieve follows:
0011010100010100010100010000010100000100010100010000010000010100000100010100000100010000010000000100
0101000101000100000000000001000100000101000000000101000001000001000100000100000101000000000101000101
0000000000010000000000010001010001000001010000000001000001000001000001010000010001010000000001000000
0000000100010100010000000000000100000100000000010100010000010000000100000100000100010000010000000100
0100000001000000000101000000000101000001000100000100000001000101000100000000000100000001000100000001
0001000001000000000001010000000000000000010000010000000001000001000001010000010000000001000001000001
0100000100000100010100000000000100000000010100010000010000010100000000000100010000010000000100000000
0100000001000000000100000001000001000001000100000001000001000100000001000100000000000001000000000100
0000000001010000000001010001010000000001000000000000010001010001000000000000010001010001000000000000
0000000100010000000100000000010000000100010000010000010000000000000100010000010000010000000100000100
0000000001000100000101000000000101000001000000000101000000000101000001000000000000000001000101000100
0001000001000000010000010000010000000000000000000001010000000001000000010000000001000001000001000000
0100000000000100010000010000010100000100000000000100000000010000000000000000010100010000010100000100
0101000100000000000101000001000000000000000000000000000000000100000100000100000001000000000000000001
0000000001000000000000010001010001000001000000010001010000010000000000010000000001010001010001000001
0000000000010000000000010000000100000000000100000100010000010000000100010000000100010000000000000100
0100000101000100000101000001000000000100000000000000000001000001000101000000000000000000000001000101
0000000001000000000001010000000001000000010000010000010000010000000000000000010000010001010000000000
0100000000010000000000010000000100000000000000010000000000000100000100010100010100000000010000000000
0100000100000100000000000000000101000000000000000101000000000000000000000100000100000001000001000101
Primes follow:
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     1009    1013
1019    1021    1031    1033    1039    1049    1051    1061    1063    1069
1087    1091    1093    1097    1103    1109    1117    1123    1129    1151
1153    1163    1171    1181    1187    1193    1201    1213    1217    1223
1229    1231    1237    1249    1259    1277    1279    1283    1289    1291
1297    1301    1303    1307    1319    1321    1327    1361    1367    1373
1381    1399    1409    1423    1427    1429    1433    1439    1447    1451
1453    1459    1471    1481    1483    1487    1489    1493    1499    1511
1523    1531    1543    1549    1553    1559    1567    1571    1579    1583
1597    1601    1607    1609    1613    1619    1621    1627    1637    1657
1663    1667    1669    1693    1697    1699    1709    1721    1723    1733
1741    1747    1753    1759    1777    1783    1787    1789    1801    1811
1823    1831    1847    1861    1867    1871    1873    1877    1879    1889
1901    1907    1913    1931    1933    1949    1951    1973    1979    1987
1993    1997    1999


Commentary about the programs: It looks like quite a bit of red, but many of these differences are superficial and repetitious, so it isn't as bad as it seems.


Copyright © 2011, Neal R. Wagner. Permission is granted to access, download, share, and distribute, as long as this notice remains.