
Patrick B. answered 05/31/21
Math and computer tutor/teacher
import java.util.ArrayList;
import java.io.*;
class BigInteger
{
protected String numstr;
int size;
public BigInteger(String numStr)
{
numstr = new String(numStr);
size = numstr.length();
}
public BigInteger() { numstr=null; size=0; }
public int GetSize() { return(numstr.length()); }
public String Get() { return (new String(numstr)); }
public BigInteger(BigInteger x)
{
numstr = new String(x.numstr);
size = numstr.length();
}
public BigInteger(int size, int digit)
{
String strnum = new String();
for (int iLoop=0; iLoop<size; iLoop++)
{
strnum = strnum + (new Integer(digit)).toString() ;
}
strnum.trim();
this.numstr = new String(strnum);
this.size = this.numstr.length();
}
public int LeadingZeros(int n)
{
int iReturn=0;
if (n > this.size)
{
int N = n - this.size;
BigInteger leadingZeros = new BigInteger(N,0);
this.numstr = new String( leadingZeros.Get() + this.numstr );
this.size = this.numstr.length();
}
else
{
iReturn = -1;
}
return(iReturn);
}
//adds to this and returns the sum
public BigInteger Add( BigInteger x)
{
BigInteger sum = null;
if (this.numstr!=null && x.numstr!=null)
{
//first, copies....
BigInteger A = new BigInteger(this);
BigInteger B = new BigInteger(x);
//Next, makes them the same size by padding with leading zeros...
int sizeA = A.GetSize();
int sizeB = B.GetSize();
int N;
if (sizeB > sizeA)
{
N = sizeB;
A.LeadingZeros(N);
}
else
{
N = sizeA;
B.LeadingZeros(N);
}
//Finally the addition
String numstrA = A.Get();
String numstrB = B.Get();
String sumStr=new String();
System.out.println(" numStrA = >" + numstrA + "< : numstrB = >" + numstrB + "<");
int iSum,carry=0;
int digitA,digitB;
for (int iLoop=N-1; iLoop>=0; iLoop--)
{
digitA = (int) (numstrA.charAt(iLoop)-48);
digitB = (int) (numstrB.charAt(iLoop)-48);
iSum = digitA + digitB + carry;
if (iSum>=10)
{
carry=1;
iSum %=10;
}
else
{
carry=0;
}
char chArray[] = new char[1];
chArray[0]= (char)(iSum+48);
sumStr = (new String( chArray)) + sumStr;
}
if (carry==1) { sumStr = "1" + sumStr; }
sum = new BigInteger(sumStr);
} //numstr not null
return(sum);
} //Add
//adds to this and returns the sum
public BigInteger Subtract( BigInteger x)
{
BigInteger difference = null;
if (this.numstr!=null && x.numstr!=null)
{
//first, copies....
BigInteger A = new BigInteger(this);
BigInteger B = new BigInteger(x);
//Next, makes them the same size by padding with leading zeros...
int sizeA = A.GetSize();
int sizeB = B.GetSize();
int N;
if (sizeB > sizeA)
{
N = sizeB;
A.LeadingZeros(N);
}
else
{
N = sizeA;
B.LeadingZeros(N);
}
//Finally the subtraction
String numstrA = A.Get();
String numstrB = B.Get();
String diffStr=new String();
System.out.println(" numStrA = >" + numstrA + "< : numstrB = >" + numstrB + "<");
int iDiff,borrow=0;
int digitA,digitB;
for (int iLoop=N-1; iLoop>=0; iLoop--)
{
digitA = (int) (numstrA.charAt(iLoop)-48);
digitB = (int) (numstrB.charAt(iLoop)-48);
if (borrow==1) { digitA--; }
if (digitA < digitB)
{
borrow=1;
iDiff = 10+digitA - digitB;
}
else
{
iDiff = digitA-digitB;
borrow=0;
}
char chArray[] = new char[1];
chArray[0]= (char)(iDiff+48);
diffStr = (new String( chArray)) + diffStr;
}
difference = new BigInteger(diffStr);
} //numstr not null
return(difference);
} //Add
public BigInteger MultiplyBy10()
{
return(
new BigInteger(
new String( this.numstr +"0")
)
);
}
public BigInteger MultiplyByDigit( int digit)
{
int carry=0;
int curProduct;
int curDigit;
int resultDigit;
BigInteger product=null;
String productStr = new String();
for (int iLoop=size-1; iLoop>=0; iLoop--)
{
curDigit = numstr.charAt(iLoop)-48;
curProduct = curDigit * digit + carry;
carry = curProduct/10;
resultDigit = curProduct%10 + 48;
char charArray[] = new char[1];
charArray[0] = (char)resultDigit;
productStr = new String(charArray) + productStr;
}
productStr = carry + productStr;
product = new BigInteger(productStr);
return(product);
}
public BigInteger Multiply(BigInteger x)
{
int n=x.GetSize();
BigInteger partialProducts[] = new BigInteger[n];
int powerOf10=0;
int curDigit;
String numStrX = x.Get();
int iIndexPos=0;
for (int iLoop= n-1; iLoop>=0; iLoop--)
{
curDigit = (int) (numStrX.charAt(iLoop)-48);
partialProducts[iIndexPos] = this.MultiplyByDigit(curDigit);
for (int exponentLoop=0; exponentLoop<powerOf10; exponentLoop++)
{
partialProducts[iIndexPos] = partialProducts[iIndexPos].MultiplyBy10();
}
System.out.println(" partial product # " + (iIndexPos+1) + ">" + partialProducts[iIndexPos].Get() + "<");
iIndexPos++;
powerOf10++;
}
int N = this.size * x.GetSize() + 1;
BigInteger product = new BigInteger(N,0);
for (int iLoop=0; iLoop<partialProducts.length; iLoop++)
{
product = product.Add(partialProducts[iLoop]);
}
return(product);
}
public static void main(String args[])
{
BigInteger x = new BigInteger("123456");
BigInteger y = new BigInteger("99999");
BigInteger sum = x.Add(y);
System.out.println(sum.Get());
BigInteger diff = x.Subtract(y);
System.out.println(diff.Get());
BigInteger xTimes10 = x.MultiplyBy10();
System.out.println(xTimes10.Get());
BigInteger yTimes5 = y.MultiplyByDigit(5);
System.out.println(yTimes5.Get());
BigInteger num1 = new BigInteger("321");
BigInteger num2 = new BigInteger("456");
BigInteger product = num1.Multiply(num2);
System.out.println(product.Get());
}
}