public HugeInteger sum(HugeInteger hugeInt) { var carry = 0; bool summing = true; //only summing if signs equal if (sign != hugeInt.sign) { summing = false; } var newDigits = new int[30]; var newSign = Sign.Positive; if (summing) { //add from lowest index/place to highest index/place for (int i = 0; i < DIGITS_SIZE; i++) { newDigits[i] = (digits[i] + hugeInt.digits[i] + carry) % 10; carry = (digits[i] + hugeInt.digits[i] + carry) / 10; } newSign = sign; } else { //clone to prevent mutation of original var clone = hugeInt.clone(); clone.sign = Sign.Positive; return(diff(clone)); } return(new HugeInteger(newDigits, newSign)); }
public HugeInteger div(HugeInteger hugeInt) { //return zero if numerator is less than denominator if (larger(hugeInt) == hugeInt) { return(new HugeInteger()); } else { var newSign = sign != hugeInt.sign ? Sign.Negative : Sign.Positive; var divisor = hugeInt.clone(); divisor.sign = Sign.Positive; var dividend = clone(); dividend.sign = Sign.Positive; var quotient = new HugeInteger(); //repeatedly subtract divisor from dividend until dividend is smaller than divisor while (dividend.larger(divisor) != divisor) { quotient = quotient.sum(Input("1")); dividend = dividend.diff(divisor); } quotient.sign = newSign; return(quotient); } }
public HugeInteger mod(HugeInteger hugeInt) { var newSign = sign != hugeInt.sign ? Sign.Negative : Sign.Positive; //return numerator if it is less than denominator if (larger(hugeInt) == hugeInt) { var result = clone(); result.sign = newSign; return(result); } else { //clone to prevent mutation of original var divisor = hugeInt.clone(); divisor.sign = Sign.Positive; //clone to prevent mutation of original var dividend = clone(); dividend.sign = Sign.Positive; //repeatedly subtract divisor from dividend until dividend is smaller than divisor while (dividend.larger(divisor) != divisor) { dividend = dividend.diff(divisor); } return(dividend); } }
private HugeInteger preBorrow(HugeInteger larger, HugeInteger smaller) { //clone to prevent mutation of original var largerClone = larger.clone(); for (int i = DIGITS_SIZE - 1; i >= 0; i--) { if (larger.digits[i] < smaller.digits[i]) { //find index to borrow from var greaterThanIndex = 0; for (int p = i + 1; p < DIGITS_SIZE; p++) { if (largerClone.digits[p] > smaller.digits[p]) { greaterThanIndex = p; break; } } //borrow largerClone.digits[greaterThanIndex]--; //distribute the borrow to intermediate indicies for (int j = greaterThanIndex - 1; j > i; j--) { largerClone.digits[j] += 9; } //distribute borrow to digit needing it largerClone.digits[i] += 10; } } return(largerClone); }
public HugeInteger diff(HugeInteger hugeInt) { //signs match so add if (sign == Sign.Negative && hugeInt.sign == Sign.Positive) { //clone to prevent mutation of original var clone = hugeInt.clone(); clone.sign = Sign.Negative; return(sum(clone)); } //signs match so add if (sign == Sign.Positive && hugeInt.sign == Sign.Negative) { //clone to prevent mutation of original var clone = hugeInt.clone(); clone.sign = Sign.Positive; return(sum(clone)); } var largest = larger(hugeInt); var smallest = largest == this ? hugeInt : this; //pre borrow if any digits in larger number are smaller than //any digits in the smaller number in respective indicies largest = preBorrow(largest, smallest); var newDigits = new int[30]; var newSign = largest.sign; //subtract from highest index/place to lowest index/place for (int i = DIGITS_SIZE - 1; i >= 0; i--) { newDigits[i] = (largest.digits[i] - smallest.digits[i]) % 10; } return(new HugeInteger(newDigits, newSign)); }