C語言實現整型字符串相乘

好長時間沒寫C程序了,今天來實現一個整型字符串相乘的小程序。直接上代碼,歡迎拍磚。

#include <string.h>
#include <sys/malloc.h>
#include <stdio.h>
#include <stdlib.h>

void reverse(char *a) {
	int n = strlen(a), i = 0, tmp = 0;

	for (i = 0; i < n / 2; ++i) {
		tmp = a[i];
		a[i] = a[n - 1 - i];
		a[n - 1 - i] = tmp;
	}
}

char *min_multi(char *a, char c, int base) {
	int n = strlen(a);
	int i = 0, j = 0;
	int x = c - '0', f = 0, tmp = 0;

	int size = n + 2 + base;
	char *ret = (char *)malloc(size * sizeof(char));
	memset(ret, 0, size * sizeof(char));

	for (i = n - 1; i >= 0; --i) {
		tmp = (a[i] - '0') * x + f;
		ret[j++] = tmp % 10 + '0';
		f = tmp / 10;
	}
	if (f > 0) {
		ret[j++] = f + '0';
	}

	reverse(ret);
	for (i = 0; i < base; ++i) {
		ret[j + i] = '0';
	}

	return ret;
}

void add(char *a, char *b) {
	int n = strlen(a);
	int m = strlen(b);
	int i = 0, j = 0, k = 0;
	int tmp = 0, f = 0;

	int size = n > m ? n + 2 : m + 2;
	char *_a = (char *)malloc(size * sizeof(char));
	memset(_a, 0, size * sizeof(char));

	for (i = n - 1, j = m - 1; i >= 0; --i) {
		if (j < 0) {
			break;
		}
		tmp = a[i] - '0' + b[j--] - '0' + f;
		_a[k++] = tmp % 10 + '0';
		f = tmp / 10;
	}

	if (i < 0 && j >= 0) {
		while (j >= 0) {
			tmp = b[j--] - '0' + f;
			_a[k++] = tmp % 10 + '0';
			f = tmp / 10;
		}
	}

	if (i >= 0 && j < 0) {
		while (i >= 0) {
			tmp = a[i--] - '0' + f;
			_a[k++] = tmp % 10 + '0';
			f = tmp / 10;
		}
	}

	if (f > 0) {
		_a[k++] = f + '0';
	}

	reverse(_a);
	memset(a, 0, n);
	strncpy(a, _a, k);
	free(_a);
}

char *pre_proc(char *a, int *flag) {
	int n = strlen(a);
	int size = n + 1;
	char *_a = (char *)malloc(size * sizeof(char));
	memset(_a, 0, size * sizeof(char));

	if (n == 0) return _a;

	if (a[0] == '-' || a[0] == '+') {
		strncpy(_a, a + 1, n - 1);
		if (a[0] == '-') {
			*flag = -1;
		}
		if (a[0] == '+') {
			*flag = 1;
		}
		return _a;
	}

	strncpy(_a, a, n);
	*flag = 1;

	return _a;
}

void add_flag(char *a, int flag) {
	if (flag == 1) {
		return ;
	}
	int n = strlen(a);

	a[n + 1] = 0;
	while (n > 0) {
		a[n] = a[n - 1];
		--n;
	}
	a[0] = '-';
}

char *multi(char *a, char *b) {
	int flag_a = 1;
	int flag_b = 1;
	a = pre_proc(a, &flag_a);
	b = pre_proc(b, &flag_b);
	int n = strlen(a);
	int m = strlen(b);
	int i = 0, j = 0;
	char *p = NULL;

	int size = n * m + 3;
	char *ret = (char *)malloc(size * sizeof(char));
	memset(ret, 0, size * sizeof(char));

	if (n == 0 || m == 0) {
		return ret;
	}

	for (i = m - 1; i >= 0; --i) {
		p = min_multi(a, b[i], m - 1 - i);
		add(ret, p);
		free(p);
	}
	add_flag(ret, flag_a * flag_b);

	free(a);
	free(b);

	return ret;
}

void test_multi(void) {
	char *a = "-1234567898765432112345678987654321";
	char *b = "+9876543212345678998765432123456789";
	char *ret = multi(a, b);
	printf("%s\n", ret);
	free(ret);
}

void test_min_multi(void) {
	char *a = "123";
	char c = '9';

	char *p = min_multi(a, c, 1);
	printf("%s\n", p);
}

int main(void) {
	//test_min_multi();
	test_multi();

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章