int main(void) { printf("Enter the size of operand 1, followed by the size of operand 2, followed by the " "numbers in operand 1, followed by the numbers in operand 2.\n"); size_t op1_sz, op2_sz; while (scanf("%zu%zu", &op1_sz, &op2_sz) == 2) { read_list(operand1, op1_sz); read_list(operand2, op2_sz); printf("\t"); print_list(&operand1[0]); printf("+\t"); print_list(&operand2[0]); printf("----------------------------------------------------\n"); struct list_node *res; res = bigint_sum(&operand1[0], &operand2[0], &result[0]); printf("\t"); print_list(res); printf("\n"); } return 0; }
void bigint_substract(char *Int1, char *Int2, char *sub) { char *minuend = Int1; char *subtrahend = (char *)malloc(int_max * sizeof(char)); memcpy(subtrahend, Int2, int_max); subtrahend[int_max - 1] = 1 - subtrahend[int_max - 1]; bigint_sum(minuend, subtrahend, sub); free(subtrahend); }
void bigint_mul(char *Int1, char *Int2, char *mulp) { char *largep = NULL; char *smallp = NULL; int int1_len = int_max - 1; int int2_len = int_max - 1; int min_len = 0, max_len = 0; while (Int1[--int1_len]==0); while (Int2[--int2_len]==0); if (int1_len > int2_len) { largep = Int1; smallp = Int2; min_len = int2_len; max_len = int1_len; } else { largep = Int2; smallp = Int1; min_len = int1_len; max_len = int2_len; } int i = 0, j = 0; char mul = 0, carrier = 0; char *mul_buf = (char *)malloc(int_max * sizeof(char)); memset(mul_buf, 0, int_max); char *sum_buf = (char *)malloc(int_max * sizeof(char)); for (i = 0; i <= min_len; i++) { memset(sum_buf, 0, int_max); carrier = 0; mul = 0; for (j = 0; j <= max_len; j++) { mul = smallp[i] * largep[j] + carrier; carrier = mul / 10; mul = mul % 10; sum_buf[j + i] = mul; } sum_buf[max_len + i + 1] = carrier; bigint_sum(sum_buf, mul_buf, mul_buf); } memcpy(mulp, mul_buf, int_max); if (Int1[int_max - 1] ^ Int2[int_max - 1]) mulp[int_max - 1] = -1; free(mul_buf); free(sum_buf); }
int main(void) { char * bigint1 = (char *)malloc(int_max * sizeof(char)); char * bigint2 = (char *)malloc(int_max * sizeof(char)); char * bigint3 = (char *)malloc(int_max * sizeof(char)); char * bigintsum = (char *)malloc(int_max * sizeof(char)); char * bigintsub = (char *)malloc(int_max * sizeof(char)); char * bigintmul = (char *)malloc(int_max * sizeof(char)); memset(bigint1, 0, int_max); memset(bigint2, 0, int_max); memset(bigint3, 0, int_max); memset(bigintsum, 0, int_max); memset(bigintsub, 0, int_max); memset(bigintmul, 0, int_max); double_2_bigint(bigint1, 7462911385); double_2_bigint(bigint2, 9800724324238); string_2_bigint(bigint3, "-4399000324898602398927826786492023650000000000000000000043242340000"); bigint_sum(bigint1, bigint2, bigintsum); bigint_substract(bigint1, bigint2, bigintsub); bigint_mul(bigint1, bigint3, bigintmul); print_bigint(bigint1); print_bigint(bigint2); printf("large? %d\n", bigint_ge(bigint1, bigint2)); printf("small? %d\n", bigint_le(bigint1, bigint2)); printf("equal? %d\n", bigint_eq(bigint1, bigint2)); print_bigint(bigint3); print_bigint(bigintsum); print_bigint(bigintsub); print_bigint(bigintmul); free(bigint1); free(bigint2); free(bigint3); free(bigintsum); free(bigintsub); free(bigintmul); return 0; }