源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 100
typedef struct Node{
int data;
struct Node* pre;
struct Node* next;
int pos;//记录结点数量
}node,*list;//双链表结点
void Value(list& L) {
L = new node;
L->pos = 0;
L->pre = NULL;
L->next = NULL;
L->data = 0;
list tmp = L;
char str[MAX];
scanf_s("%s", &str, MAX);
for (int i = 0; i < strlen(str); i++) {
list p;
p = new node;
p->data = str[i] - '0';
tmp->next = p;
p->pre = tmp;
tmp = tmp->next;
p->next = NULL;
L->pos++;
}
}//初始化结点,输入数据
list jia(list& L, list& G) {
list a, b, c, tmp, R;//a用来操作L链表,b用来操作G链表,c来操作R链表
int j, n, r, k = 0, l = L->pos, g = G->pos;
a = new node;
a = L->next;
b = new node;
b = G->next;
c = new node;
R = new node;
R->pos = 0;
R->data = 0;
R->pre = NULL;
R->next = NULL;
//初始化链表R
if (L->pos >= G->pos)n = L->pos + 1;
else n = G->pos + 1;
tmp = R;
while (n--) {
list p;
p = new node;
p->data = 0;
tmp->next = p;
p->pre = tmp;
tmp = tmp->next;
p->next = NULL;
R->pos++;
}//给R足够的结点空间
c = R->next;
r = R->pos;
while (--l) { a = a->next; }
while (--g) { b = b->next; }
while (--r) { c = c->next; }
//从个位开始操作
while (a && b) {
if (a->data + b->data > 9) {
j = a->data + b->data - 10;
c->data = j + k;
a = a->pre;
b = b->pre;
c = c->pre;
k = 1;
}
else {
c->data = ((a->data + b->data) + k)%10;
if (c->data == 0)
{
k = 1;
}
else
{
k = 0;
}
a = a->pre;
b = b->pre;
c = c->pre;
}
}
while (a) {
c->data = a->data;
a = a->pre;
c = c->pre;
}//判断L是否还有剩,剩下的添加到R
while (b) {
c->data = b->data;
b = b->pre;
c = c->pre;
}//同上,判断G
return R;
}//加法函数
list cheng(list& L, list& G) {
list a, b, c, tmp, R,T;//a用来操作L链表,b用来操作G链表,c来操作R链表
int n, r,l = L->pos, g = G->pos;
a = new node;
a = L->next;
b = new node;
b = G->next;
c = new node;
T = new node;
R = new node;
R->pos = 0;
R->data = 0;
R->pre = NULL;
R->next = NULL;
//初始化链表R,R链表是来存放结果
n = l + g;
tmp = R;
while (n--) {
list p;
p = new node;
p->data = 0;
tmp->next = p;
p->pre = tmp;
tmp = tmp->next;
p->next = NULL;
R->pos++;
}//给R足够的结点空间
c = R->next;
r = R->pos;
while (--l) { a = a->next; }
while (--g) { b = b->next; }
while (--r) { c = c->next; }
//从个位开始操作
for (int i = 0; i < G->pos; i++) {
list p = a,q=c;
int k = 0,t;//k表示产生的进位
for (int j = 0; j <= L->pos; j++) {
t = q->data;
q->data= (b->data * p->data+k+q->data) % 10;
k = (b->data * p->data+k+t) / 10;
p = p->pre;
q = q->pre;
}
c = c->pre;
b = b->pre;
}
return R;
}
void print(list& L) {
list tmp ;
tmp = new node;
tmp = L->next;
if (tmp->data == 0)tmp = tmp->next;
while (tmp) {
printf("%d", tmp->data);
tmp = tmp->next;
}
}//输出函数
int main() {
printf("************************大整数加法乘法**************************\n\n\n\n\n\n\n");
printf("\t\t1.加法\n");
printf("\t\t2.乘法\n\n\n\n\n\n");
printf("************************大整数加法乘法**************************\n");
list A, B,C;
int choose;
char quit;
list (*p[])(list&, list&) = {NULL,jia,cheng};
while (1) {
printf("请输入加法或乘法前的序号\n");
scanf_s("%d", &choose);
if (choose == 1 || choose == 2) {
printf("请输入第一个大整数\n");
Value(A);
printf("请输入第二个大整数\n");
Value(B);
C = (*p[choose])(A, B);
printf("结果是:");
print(C);
}
else {
printf("输入错误\n");
}
printf("\n是否继续运算,'y'还是'n'?\n");
getchar();
scanf_s("%c",&quit,1);
if (quit == 'n' || quit == 'N') { break; }
}
system("pause");
return 0;
}