You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
7.9 KiB
Java
267 lines
7.9 KiB
Java
/*
|
|
This is a java program to perform arithmetic operations on numbers which are greater than size of the integers.
|
|
*/
|
|
|
|
|
|
import java.util.Scanner;
|
|
|
|
public class BigNumber
|
|
{
|
|
static final int MAXDIGITS = 100; /* maximum length bignum */
|
|
static final int PLUS = 1; /* positive sign bit */
|
|
static final int MINUS = -1; /* negative sign bit */
|
|
char digits[]; /* represent the number */
|
|
int signbit; /* 1 if positive, -1 if negative */
|
|
int lastdigit; /* index of high-order digit */
|
|
|
|
BigNumber()
|
|
{
|
|
digits = new char[MAXDIGITS];
|
|
intToBigNumber(0);
|
|
}
|
|
|
|
void printBigNumber()
|
|
{
|
|
int i;
|
|
if (signbit == MINUS)
|
|
System.out.printf("- ");
|
|
for (i = lastdigit; i >= 0; i--)
|
|
System.out.printf("%c", '0' + digits[i]);
|
|
System.out.printf("\n");
|
|
}
|
|
|
|
void intToBigNumber(int s)
|
|
{
|
|
if (s >= 0)
|
|
signbit = PLUS;
|
|
else
|
|
signbit = MINUS;
|
|
for (int i = 0; i < MAXDIGITS; i++)
|
|
digits[i] = (char) 0;
|
|
lastdigit = -1;
|
|
int t = Math.abs(s);
|
|
while (t > 0)
|
|
{
|
|
lastdigit++;
|
|
digits[lastdigit] = (char) (t % 10);
|
|
t /= 10;
|
|
}
|
|
if (s == 0)
|
|
lastdigit = 0;
|
|
}
|
|
|
|
BigNumber addBigNumber(BigNumber b)
|
|
{
|
|
int carry, i;
|
|
BigNumber c = new BigNumber();
|
|
if (signbit == b.signbit)
|
|
c.signbit = signbit;
|
|
else
|
|
{
|
|
if (signbit == MINUS)
|
|
{
|
|
signbit = PLUS;
|
|
c = b.subtractBigNumber(this);
|
|
signbit = MINUS;
|
|
}
|
|
else
|
|
{
|
|
b.signbit = PLUS;
|
|
c = this.subtractBigNumber(b);
|
|
b.signbit = MINUS;
|
|
}
|
|
return c;
|
|
}
|
|
c.lastdigit = Math.max(lastdigit, b.lastdigit) + 1;
|
|
carry = 0;
|
|
for (i = 0; i <= c.lastdigit; i++)
|
|
{
|
|
c.digits[i] = (char) ((carry + digits[i] + b.digits[i]) % 10);
|
|
carry = (carry + digits[i] + b.digits[i]) / 10;
|
|
}
|
|
c.zeroJustify();
|
|
return c;
|
|
}
|
|
|
|
BigNumber subtractBigNumber(BigNumber b)
|
|
{
|
|
int borrow, v, i;
|
|
BigNumber c = new BigNumber();
|
|
if (signbit == MINUS || b.signbit == MINUS)
|
|
{
|
|
b.signbit = -b.signbit;
|
|
c = addBigNumber(b);
|
|
b.signbit = -b.signbit;
|
|
return c;
|
|
}
|
|
if (compareBigNumber(b) == PLUS)
|
|
{
|
|
c = b.subtractBigNumber(this);
|
|
c.signbit = MINUS;
|
|
return c;
|
|
}
|
|
c.lastdigit = Math.max(lastdigit, b.lastdigit);
|
|
borrow = 0;
|
|
for (i = 0; i <= c.lastdigit; i++)
|
|
{
|
|
v = digits[i] - borrow - b.digits[i];
|
|
if (digits[i] > 0)
|
|
borrow = 0;
|
|
if (v < 0)
|
|
{
|
|
v = v + 10;
|
|
borrow = 1;
|
|
}
|
|
c.digits[i] = (char) (v % 10);
|
|
}
|
|
c.zeroJustify();
|
|
return c;
|
|
}
|
|
|
|
int compareBigNumber(BigNumber b)
|
|
{
|
|
int i;
|
|
if (signbit == MINUS && b.signbit == PLUS)
|
|
return PLUS;
|
|
if (signbit == PLUS && b.signbit == MINUS)
|
|
return MINUS;
|
|
if (b.lastdigit > lastdigit)
|
|
return PLUS * signbit;
|
|
if (lastdigit > b.lastdigit)
|
|
return MINUS * signbit;
|
|
for (i = lastdigit; i >= 0; i--)
|
|
{
|
|
if (digits[i] > b.digits[i])
|
|
return MINUS * signbit;
|
|
if (b.digits[i] > digits[i])
|
|
return PLUS * signbit;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void zeroJustify()
|
|
{
|
|
while (lastdigit > 0 && digits[lastdigit] == 0)
|
|
lastdigit--;
|
|
if (lastdigit == 0 && digits[0] == 0)
|
|
signbit = PLUS; /* hack to avoid -0 */
|
|
}
|
|
|
|
void digitShift(int d)
|
|
{
|
|
int i;
|
|
if (lastdigit == 0 && digits[0] == 0)
|
|
return;
|
|
for (i = lastdigit; i >= 0; i--)
|
|
digits[i + d] = digits[i];
|
|
for (i = 0; i < d; i++)
|
|
digits[i] = 0;
|
|
lastdigit += d;
|
|
}
|
|
|
|
BigNumber multiplyBigNumber(BigNumber b)
|
|
{
|
|
BigNumber row = new BigNumber();
|
|
BigNumber tmp = new BigNumber();
|
|
BigNumber c = new BigNumber();
|
|
int i, j;
|
|
row.signbit = this.signbit;
|
|
row.lastdigit = this.lastdigit;
|
|
System.arraycopy(this.digits, 0, row.digits, 0, this.digits.length);
|
|
for (i = 0; i <= b.lastdigit; i++)
|
|
{
|
|
for (j = 1; j <= b.digits[i]; j++)
|
|
{
|
|
tmp = c.addBigNumber(row);
|
|
c = tmp;
|
|
}
|
|
row.digitShift(1);
|
|
}
|
|
c.signbit = signbit * b.signbit;
|
|
c.zeroJustify();
|
|
return c;
|
|
}
|
|
|
|
BigNumber divideBigNumber(BigNumber b)
|
|
{
|
|
BigNumber row = new BigNumber();
|
|
BigNumber tmp = new BigNumber();
|
|
BigNumber c = new BigNumber();
|
|
int asign, bsign, i;
|
|
c.signbit = signbit * b.signbit;
|
|
asign = signbit;
|
|
bsign = b.signbit;
|
|
signbit = PLUS;
|
|
b.signbit = PLUS;
|
|
c.lastdigit = lastdigit;
|
|
for (i = lastdigit; i >= 0; i--)
|
|
{
|
|
row.digitShift(1);
|
|
row.digits[0] = digits[i];
|
|
c.digits[i] = 0;
|
|
while (row.compareBigNumber(b) != PLUS)
|
|
{
|
|
c.digits[i]++;
|
|
tmp = row.subtractBigNumber(b);
|
|
row = tmp;
|
|
}
|
|
}
|
|
c.zeroJustify();
|
|
signbit = asign;
|
|
b.signbit = bsign;
|
|
return c;
|
|
}
|
|
}
|
|
|
|
public class ArithmeticOpsBigNumbers
|
|
{
|
|
public static void main(String[] args)
|
|
{
|
|
int a, b;
|
|
BigNumber n1 = new BigNumber();
|
|
BigNumber n2 = new BigNumber();
|
|
BigNumber n3 = new BigNumber();
|
|
BigNumber zero = new BigNumber();
|
|
Scanner sc = new Scanner(System.in);
|
|
while (sc.hasNextInt())
|
|
{
|
|
a = sc.nextInt();
|
|
b = sc.nextInt();
|
|
System.out.printf("a = %d b = %d\n", a, b);
|
|
n1.intToBigNumber(a);
|
|
n2.intToBigNumber(b);
|
|
n3 = n1.addBigNumber(n2);
|
|
System.out.printf("Addition: ");
|
|
n3.printBigNumber();
|
|
System.out.printf("Comparing Numbers a ? b: %d\n",
|
|
n1.compareBigNumber(n2));
|
|
n3 = n1.subtractBigNumber(n2);
|
|
System.out.printf("Subtraction: ");
|
|
n3.printBigNumber();
|
|
n3 = n1.multiplyBigNumber(n2);
|
|
System.out.printf("Multiplication: ");
|
|
n3.printBigNumber();
|
|
zero.intToBigNumber(0);
|
|
if (zero.compareBigNumber(n2) == 0)
|
|
System.out.printf("Division: NaN \n");
|
|
else
|
|
{
|
|
n3 = n1.divideBigNumber(n2);
|
|
System.out.printf("Division: ");
|
|
n3.printBigNumber();
|
|
}
|
|
}
|
|
sc.close();
|
|
}
|
|
}
|
|
|
|
/*
|
|
12342424
|
|
12313423
|
|
a = 12342424 b = 12313423
|
|
Addition: 24655847
|
|
Comparing Numbers a ? b: -1
|
|
Subtraction: 29001
|
|
Multiplication: 151977487557352
|
|
Division: 1
|