好长时间没写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;
}