bigInt multiplyBigInt(bigInt a, bigInt b){ bigInt product("0"); bigInt greater("0"); bigInt lesser("0"); if (b.num.size() > a.num.size()){ // Find vector with most elements greater = b; lesser = a; } else{ greater = a; lesser = b; } product.num.resize(a.num.size() + b.num.size()); // Get the magnitude of the product product.bigIntInit(); int k = 0; for (unsigned long i = 0; i < lesser.num.size(); i++){ // By hand style multiplacation for (unsigned long j = 0; j < greater.num.size(); j++){ product.num[j + k] += greater.num[j] * lesser.num[i]; } k++; } product.cleanCarries(); if (a.isNegative != b.isNegative){ product.isNegative = 1; } return product; }
static mrb_value sym_cmp(mrb_state *mrb, mrb_value s1) { mrb_value s2; mrb_sym sym1, sym2; mrb_get_args(mrb, "o", &s2); if (mrb_type(s2) != MRB_TT_SYMBOL) return mrb_nil_value(); sym1 = mrb_symbol(s1); sym2 = mrb_symbol(s2); if (sym1 == sym2) return mrb_fixnum_value(0); else { const char *p1, *p2; int retval; mrb_int len, len1, len2; p1 = mrb_sym2name_len(mrb, sym1, &len1); p2 = mrb_sym2name_len(mrb, sym2, &len2); len = lesser(len1, len2); retval = memcmp(p1, p2, len); if (retval == 0) { if (len1 == len2) return mrb_fixnum_value(0); if (len1 > len2) return mrb_fixnum_value(1); return mrb_fixnum_value(-1); } if (retval > 0) return mrb_fixnum_value(1); return mrb_fixnum_value(-1); } }
int main() { bignum l1 = from_str("99"), l2 = from_str("10"); printf("%s\n", to_str(from_int(666))); printf("%d\n", to_int(from_str("666"))); bignum sum = plus(l1, l2); printf("%s\n", to_str(sum)); bignum diff = minus(l1, l2); printf("%s\n", to_str(diff)); printf("%i\n", lesser(l1, l2)); bignum muli = mul_int(l1, 2); printf("%s\n", to_str(muli)); printf("%d\n", mod_int(l1, 10)); bignum divi = div_int(l1, 10); printf("%s\n", to_str(divi)); bignum mul = multiply(l1, l2); printf("%s\n", to_str(mul)); bignum div = divide(l1, l2); printf("%s\n", to_str(div)); bignum mod = modulo(l1, l2); printf("%s\n", to_str(mod)); return 0; }
int equal(bignum x, bignum y) { return !lesser(x, y) && !lesser(y, x); }
int greater (bignum x, bignum y) { return lesser(y, x); }