这个程序主要作用是高精度算法中的加法与乘法,但是由于大小限制,我只能吧乘法的删掉,给大家粗劣地看一下,我主要想问,这里使用了链表了么,因为他每个函数都是结构体指针,这样做有什么用呢,作用是什么,有什么好处?
typedef struct number NUMBER;
这个程序主要作用是高精度算法中的加法与乘法,但是由于大小限制,我只能吧乘法的删掉,给大家粗劣地看一下,我主要想问,这里使用了链表了么,因为他每个函数都是结构体指针,这样做有什么用呢,作用是什么,有什么好处?
typedef struct number NUMBER;
struct number {
int length;
char *data;
};
NUMBER *make_number(long n)
{
char buffer[16];
int len, i;
NUMBER *u;
len = sprintf(buffer, "%d", (n >= 0) ? n : -n);
for (i = 0; buffer[i] != '\0'; i++)
buffer[i] = buffer[i] - '0';
u = (NUMBER *) malloc(sizeof(NUMBER));
u->length = len;
u->data = (char *) malloc(sizeof(char)*(len+1));
memmove(u->data, buffer, len+1);
return u;
}
NUMBER *add(NUMBER *opn1, NUMBER *opn2)
{
int m = opn1->length;
char *u = opn1->data;
int n = opn2->length;
char *v = opn2->data;
char *w, *p;
int mn = MAX(m,n)+1;
int carry = 0, temp;
int i, j, k, t;
NUMBER *result;
w = (char *) malloc(sizeof(char)*(mn+1));
w[mn] = '\0';
for (i=m-1, j=n-1, k=mn-1; i>=0 && j>=0; i--,j--,k--) {
temp = u[i] + v[j] + carry;
w[k] = (char) (temp % BASE);
carry = temp / BASE;
}
if (i >= 0)
p = u, t = i;
else
p = v, t = j;
for ( ; t >= 0; t--, k--) {
temp = p[t] + carry;
w[k] = (char) (temp % BASE);
carry = temp / BASE;
}
w[0] = carry;
result = (NUMBER *) malloc(sizeof(NUMBER));
if (w[0] == '\0') {
mn--;
result->data = (char *) malloc(sizeof(char)*(mn+1));
memmove(result->data, &w[1], mn+1);
free(w);
}
else
result->data = w;
result->length = mn;
return result;
}
void main(void)
{
NUMBER *prod, *opn1, *opn2;
NUMBER *sum, *temp;
int N;
char line[100];
int i;
printf("\nInfinite Precision Addition and Multiplication");
printf("\n==============================================");
printf("\n\nFactorial of N --> ");
gets(line);
N = atoi(line);
prod = make_number(1);
sum = make_number(0);
for (i = 1; i <= N; i++) {
opn1 = make_number((long) i);
opn2 = multiply(prod, opn1);
printf("\n%2d! = ", i);
display_number(opn2);
free(prod->data); free(prod);
free(opn1->data); free(opn1);
prod = opn2;
temp = add(sum, prod);
free(sum->data); free(sum);
sum = temp;
}
printf("\n\n1! + 2! + ..... + %d! = ", N);
display_number(sum);
展开
全部