//Define a huge integer and implement its arithmetic calculation
//Java how to program, 5/e, Exercise 8.10
import javax.swing.*;
public class HugeInteger {
private int[ ] singleDigits=new int[40];
private int[ ] carry=new int[40];
public HugeInteger()
{
for (int i=0;i<singleDigits.length;i++)
singleDigits[i]=0;
}
public HugeInteger(int[] hugeI)
{
for (int i=0;i<singleDigits.length;i++)
singleDigits[i]=hugeI[i];
}
public void reset()
{
for (int i=0;i<singleDigits.length;i++)
singleDigits[i]=0;
}
public void input()
{
for (int i=0;i<singleDigits.length;i++)
singleDigits[i]=Integer.parseInt(JOptionPane.showInputDialog("Enter NO. "+i+"digit"));
}
public void output()
{ System.out.print("Huge Integer: ");
for (int i=0;i<singleDigits.length;i++)
System.out.print(singleDigits[i]);
System.out.println();
}
public void add(HugeInteger HI)
{ int[] repository=new int[41];
for (int i=singleDigits.length-1;i>=0;i--)
{
if (i<singleDigits.length-1)
carry[i]=(singleDigits[i]+HI.singleDigits[i]+carry[i+1])/10;
else
carry[i]=(singleDigits[i]+HI.singleDigits[i])/10;
if (i<singleDigits.length-1)
repository[i+1]=(singleDigits[i]+HI.singleDigits[i]+carry[i+1])%10;
else
repository[i+1]=(singleDigits[i]+HI.singleDigits[i])%10;
}
repository[0]=(carry[1]+singleDigits[0]+HI.singleDigits[0])/10;
if (repository[0]==1)
{
System.out.print("Overflow Error!!! ");
reset();
}
else
for (int i=0;i<singleDigits.length;i++ )
singleDigits[i]=repository[i+1];
}
public boolean substract(HugeInteger HI)
{
boolean underflowFlag=false;
int[] repository=new int[41];
for (int i=singleDigits.length-1;i>=1;i--)
{
if (singleDigits[i]-HI.singleDigits[i]>=0)
repository[i+1]=singleDigits[i]-HI.singleDigits[i];
else
{
repository[i+1]=10+singleDigits[i]-HI.singleDigits[i];
singleDigits[i-1]-=1;
}
}
repository[0]=singleDigits[0]-HI.singleDigits[0];
if (repository[0]<0)
{
System.out.print("Underflow Error!!! ");
reset();
return(underflowFlag=true);
}
else
{ repository[1]=singleDigits[0]-HI.singleDigits[0];
for (int i=0;i<singleDigits.length;i++ )
singleDigits[i]=repository[i+1];
return(underflowFlag);
}
}
public boolean isEqualTo(HugeInteger HI){
boolean equalFlag=true;
for (int i=0;i<singleDigits.length;i++)
if (singleDigits[i]!=HI.singleDigits[i])
{equalFlag=false;
break;
}
return equalFlag;
}
public boolean isNotEqualTo(HugeInteger HI){
return !isEqualTo(HI);
}
public boolean isGreaterThan(HugeInteger HI){
boolean greaterThanFlag=false;
for (int i=0;i<singleDigits.length;i++)
{
if (singleDigits[i]>HI.singleDigits[i])
{greaterThanFlag=true;
break;}
else if (singleDigits[i]<HI.singleDigits[i])
{greaterThanFlag=false;
break;}
}
return greaterThanFlag;
}
public boolean isLessThan(HugeInteger HI){
boolean lessThanFlag=false;
for (int i=0;i<singleDigits.length;i++)
{ if (singleDigits[i]<HI.singleDigits[i])
{lessThanFlag=true;
break;}
else if (singleDigits[i]>HI.singleDigits[i])
{lessThanFlag=false;
break;}
}
return lessThanFlag;
}
public boolean isGreaterThanOrEqualTo(HugeInteger HI){
return !isLessThan(HI);
}
public boolean isLessThanOrEqualTo(HugeInteger HI){
return !isGreaterThan(HI);
}
public boolean isZero(){
boolean zeroFlag=false;
int tempSum=0;
for (int i=0;i<singleDigits.length;i++)
tempSum+=singleDigits[i];
if (tempSum==0)
zeroFlag=true;
return zeroFlag;
}
}
class HugeIntegerTest{
public static void main(String[] args)
{
int[] initializer1=new int[40];
for (int i=0;i<40;i++)
initializer1[i]=(int)(10*Math.random());
int[] initializer2=new int[40];
for (int j=0;j<40;j++)
initializer2[j]=(int)(10*Math.random());
HugeInteger HI1=new HugeInteger(initializer1);
HugeInteger HI2=new HugeInteger(initializer2);
HI1.output();
HI2.output();
System.out.println();
System.out.println("These two huge integers are equal: "+HI1.isEqualTo(HI2));
System.out.println("These two huge integers are not equal: "+HI1.isNotEqualTo(HI2));
System.out.println("1st huge integer is larger than 2nd: "+HI1.isGreaterThan(HI2));
System.out.println("1st huge integer is less than 2nd: "+HI1.isLessThan(HI2));
System.out.println("1st huge integer is larger than or equal to 2nd: "+
HI1.isGreaterThanOrEqualTo(HI2));
System.out.println("1st huge integer is less than or equal to 2nd: "+
HI1.isLessThanOrEqualTo(HI2));
HI1.add(HI2);
System.out.print("The sum is: ");
HI1.output();
HI1.substract(HI2);
HI1.substract(HI2);
System.out.print("The difference is: ");
HI1.output();
HI1.add(HI2);
}
}
A snapshot of Console after the execution of test class:



发表于 @ 2008年04月23日 17:48:00|评论(loading...)|编辑