import Java.io.*;
import java.util.*;
/**
* Author: Liao Xuefeng, www.crackj2ee.com
*/
public class PrimeNumber implements Serializable
{
private ArrayList list;
private int nStart;
public PrimeNumber()
{
list=new ArrayList(9);
list.add(new Integer(3));
list.add(new Integer(5));
list.add(new Integer(7));
list.add(new Integer(11));
list.add(new Integer(13));
list.add(new Integer(17));
list.add(new Integer(19));
list.add(new Integer(23));
list.add(new Integer(29));
nStart=31;
}
public void calculate(int number)
{
System.out.print("Start calculating prime numbers... ");
if (number<=0)
return;
list.ensureCapacity(number);
int nGot=0;
boolean bPrime;
int n;
for(int nTest=nStart; ; nTest+=2)
{
bPrime=true;
for(int i=0; i<list.size(); i++)
{
n=((Integer)(list.get(i))).intValue();
if (nTest % n == 0)
// not a prime number:
{
bPrime=false;
break;
}
}
if (bPrime) // found a prime number
{
list.add(new Integer(nTest));
nGot++;
System.out.print("\nFound "+nTest+", "+(number-nGot)+" left.");
if (nGot==number) // ok, finish calculation.
{
nStart=nTest+2;
System.out.println("\ndone.\n");
return;
}
}
}
}
public static boolean store(PrimeNumber obj)
{
ObjectOutputStream objOut = null;
try
{
objOut=new ObjectOutputStream(new FileOutputStream("prime.obj"));
objOut.writeObject(obj);
return true;
}
catch(Exception e) {}
finally {
if(objOut!=null) {
try { objOut.close(); } catch(Exception e) {}
}
}
return false;
}
public static PrimeNumber load()
{
try
{
ObjectInput objIn=new ObjectInputStream(new FileInputStream("prime.obj"));
PrimeNumber pn=(PrimeNumber)objIn.readObject();
objIn.close();
return pn;
}
catch(Exception e)
{
}
return null;
}
public void display()
{
System.out.print("\nThere are " + (list.size()+1) + " prime numbers.\n2\t");
for(int i=0; i<list.size(); i++)
{
System.out.print(list.get(i).toString());
System.out.print("\t");
}
System.out.println("\n");
}
public void displayLast()
{
int nStart=list.size()-20;
System.out.println("\nThe last 20 prime numbers:");
if(nStart<0)
System.out.print("2\t");
for(int i=nStart; i<list.size(); i++)
{
if (i>=0)
System.out.print(list.get(i).toString()+"\t");
}
System.out.println("\n");
}
public void storeAsFile()
{
DataOutputStream dos = null;
try {
dos = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream("prime.data")));
dos.writeInt(2);
for(int i=0; i<list.size(); i++) {
dos.writeInt(((Integer)list.get(i)).intValue());
}
System.out.println("Prime numbers has been saved.\n");
}
catch(Exception e) {
System.out.println("There is an error occured. Saving failed.\n");
}
finally {
if(dos!=null) {
try { dos.close(); } catch(Exception e) {}
}
}
}
public static void main(String[] args)
{
// first try to read from disk:
System.out.print("Reading from file... ");
PrimeNumber pn=PrimeNumber.load();
if (pn==null)
{
System.out.println("failed.\nCreate a new calculator... done.");
pn=new PrimeNumber();
}
else
System.out.println("done.");
int sel;
do
{
System.out.println("==============================================================");
sel=pn.getCommand();
switch(sel)
{
case 1:
pn.calculate(10);
break;
case 2:
pn.calculate(100);
break;
case 3:
pn.calculate(1000);
break;
case 4:
pn.calculate(10000);
break;
case 5:
pn.display();
break;
case 6:
pn.displayLast();
break;
case 7:
pn.storeAsFile();
break;
case 8:
break;
default:
System.out.println("Invalid command.");
}
}while(sel!=8);
System.out.print("\nWriting to file... ");
System.out.println(PrimeNumber.store(pn)==true?"done.":"failed.");
}
public int getCommand()
{
System.out.println(" Total "+(list.size()+1)+" prime numbers calculated. Select:");
System.out.println(" 1. Calculate next 10 prime numbers.");
System.out.println(" 2. Calculate next 100 prime numbers.");
System.out.println(" 3. Calculate next 1000 prime numbers.");
System.out.println(" 4. Calculate next 10000 prime numbers.");
System.out.println(" 5. Display all prime numbers.");
System.out.println(" 6. Display the last 20 numbers.");
System.out.println(" 7. Save all prime numbers as a file.");
System.out.println(" 8. Save all prime numbers and quit.");
System.out.print (" Your selection: ");
int sel=0;
try
{
InputStreamReader isr=new InputStreamReader(System.in);
sel=isr.read()-48;
}
catch(IOException e){}
return sel;
}
}