NUMBER number_subtract(NUMBER num1, NUMBER num2) { int borrow, sub, i, j, flip; NUMBER tmp, res = number_new(); if (num2.negative) { num2.negative = 0; return number_add(num1, num2); } if (num1.negative) { num1.negative = 0; res = number_add(num2, num1); res.negative = 1; return res; } flip = !number_greater(num1, num2); if (flip) { tmp = num1; num1 = num2; num2 = tmp; } for (i = sub = borrow = 0; i < num1.numbers || i < num2.numbers || borrow; i++, sub = 0) { if (num2.numbers > i) sub = num2.number[i]; sub += borrow; if (num1.numbers > i) { num1.number[i] -= sub; for (j = 0; num1.number[i] < 0; j++, num1.number[i] += 10); number_insert_high(&res, num1.number[i]); borrow = j; } else { number_insert_high(&res, sub % 10); borrow = sub / 10; } } if (flip) res.negative = 1; return res; }
int main(int argc, char **argv) { NUMBER num1, num2, num3; char arg1[512], arg2[512]; fprintf(stderr, "Enter two numbers to add: "); fscanf(stdin, "%s %s", arg1, arg2); num1 = number_from_string(arg1); num2 = number_from_string(arg2); num3 = number_add(num1, num2); fprintf(stderr, "(%s) + (%s) = %s\n", arg1, arg2, number_to_string(&num3)); fprintf(stderr, "Enter two numbers to subtract: "); fscanf(stdin, "%s %s", arg1, arg2); num1 = number_from_string(arg1); num2 = number_from_string(arg2); num3 = number_subtract(num1, num2); fprintf(stderr, "(%s) - (%s) = %s\n", arg1, arg2, number_to_string(&num3)); return 0; }
VALUE wrap_add(self, a, b){ return INT2FIX( number_add( FIX2INT(a), FIX2INT(b) ) ); }