void operator_integer() { int result; char in[USHRT_MAX]; printf("Entre com o 1º valor: "); scanf("%s", in); printf("\n"); result = atoi(in); int keep_going = 1; while (keep_going) { switch (menu_integer()) { case 1: // Add printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); integer_add(&result, atoi(in)); break; case 2: // Subtract printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); integer_subtract(&result, atoi(in)); break; case 3: // Multiply printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); integer_multiply(&result, atoi(in)); break; case 4: // Power printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); integer_power(&result, atoi(in)); break; case 5: // Divide while (1) { printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); if (atoi(in) == 0) printf("Valor inválido!\n\n"); else break; } integer_divide(&result, atoi(in)); break; case 6: // Module printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); integer_module(&result, atoi(in)); break; default: keep_going = 0; break; } printf("Resultado: %d\n\n", result); } }
// MCA: ExtendedGCD int integer_gcd_extended(integer_t gcd, integer_t U, integer_t V, integer_t A, integer_t B) { integer_t a, b, u, w, v, x, q, r; INSIST(gcd != U); INSIST(gcd != V); INSIST(U != V); a = integer_create(0); b = gcd; VERIFY(integer_absolute_value(a, A)); VERIFY(integer_absolute_value(b, B)); u = U; VERIFY(integer_set_unsigned_value(u, 1)); w = integer_create(0); v = V; VERIFY(integer_set_unsigned_value(v, 0)); x = integer_create(1); q = integer_create(0); r = integer_create(0); while(!integer_is_zero(b)) { VERIFY(integer_divide(q, r, a, b)); SWAP(a, b); SWAP(b, r); VERIFY(integer_multiply(r, q, w)); VERIFY(integer_subtract(u, u, r)); SWAP(u, w); VERIFY(integer_multiply(r, q, x)); VERIFY(integer_subtract(v, v, r)); SWAP(v, x); } EXCHANGE(gcd, a); EXCHANGE(U, u); EXCHANGE(V, v); integer_destroy(q); /* gcd is passed between a, b, and r */ if(b == gcd) { integer_destroy(a); integer_destroy(r); } else if(a == gcd) { integer_destroy(b); integer_destroy(r); } else { integer_destroy(a); integer_destroy(b); } /* U and V are passed between u, w and v, x respectively */ if(u == U) { integer_destroy(w); integer_destroy(x); } else { integer_destroy(u); integer_destroy(v); } return 0; }