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;
}
Beispiel #2
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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;
}