【问题描述】编写程序实现两个超长正整数(每个最长80位数字)的加法和乘法运算。 【输入形式】从当前目录下的plus.in文件读入以下内容: 1. 第一行是超长正整数A; 2. 第二行只有一个字符“+”或“*”,分别代表加、乘运算; 3. 第三行是超长正整数B。 【输出形式】输出到当前目录下的plus.out文件中。输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出,不带有前缀的多余的0。 在行尾要输出一个回车符。 【输入文件】假设输入文件plus.in的内容如下: 13409870 * 234098 【输出文件】输出文件plus.out的内容如下: 3139223747260 【样例说明】进行两个正整数进行乘法运算,13409870 * 234098 = 3139223747260。 【评分标准】该题要求将两个超长整数的和或积输出到文件中,答对得满分,否则得0分。 上传C语言文件名为 plus.c 。
时间: 2024-02-13 15:06:07 浏览: 63
C语言编写的超长整数加法
5星 · 资源好评率100%
好的,以下是一个用 C 语言实现两个超长正整数的加法和乘法运算的程序。程序从文件中读入输入,并将结果输出到文件中。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_DIGITS 80
typedef struct node {
int digit;
struct node* next;
} node;
node* create_node(int digit) {
node* new_node = (node*) malloc(sizeof(node));
new_node->digit = digit;
new_node->next = NULL;
return new_node;
}
node* create_list(char* num) {
node* head = create_node(-1);
node* tail = head;
for (int i = strlen(num) - 1; i >= 0; i--) {
tail->next = create_node(num[i] - '0');
tail = tail->next;
}
return head;
}
node* add(node* num1, node* num2) {
node* head = create_node(-1);
node* tail = head;
int carry = 0;
while (num1 != NULL || num2 != NULL || carry != 0) {
int sum = carry;
if (num1 != NULL) {
sum += num1->digit;
num1 = num1->next;
}
if (num2 != NULL) {
sum += num2->digit;
num2 = num2->next;
}
carry = sum / 10;
tail->next = create_node(sum % 10);
tail = tail->next;
}
return head->next;
}
node* multiply(node* num1, node* num2) {
node* head = create_node(0);
for (node* digit1 = num1; digit1 != NULL; digit1 = digit1->next) {
node* temp_head = create_node(0);
node* temp_tail = temp_head;
int carry = 0;
for (node* digit2 = num2; digit2 != NULL; digit2 = digit2->next) {
int product = digit1->digit * digit2->digit + carry;
carry = product / 10;
temp_tail->next = create_node(product % 10);
temp_tail = temp_tail->next;
}
if (carry > 0) {
temp_tail->next = create_node(carry);
temp_tail = temp_tail->next;
}
for (int i = 0; i < MAX_DIGITS - (num1->digit + num2->digit - 1); i++) {
temp_tail->next = create_node(0);
temp_tail = temp_tail->next;
}
head = add(head, temp_head->next);
free(temp_head);
}
return head;
}
void print_list(node* head) {
node* curr = head;
while (curr->next != NULL) {
curr = curr->next;
}
while (curr != NULL) {
printf("%d", curr->digit);
curr = curr->next;
}
}
int main() {
FILE* fp_in = fopen("plus.in", "r");
char num1[MAX_DIGITS + 1];
char num2[MAX_DIGITS + 1];
char operator;
fscanf(fp_in, "%s\n", num1);
fscanf(fp_in, "%c\n", &operator);
fscanf(fp_in, "%s\n", num2);
fclose(fp_in);
node* list1 = create_list(num1);
node* list2 = create_list(num2);
node* result;
if (operator == '+') {
result = add(list1->next, list2->next);
} else {
result = multiply(list1->next, list2->next);
}
FILE* fp_out = fopen("plus.out", "w");
node* curr = result;
while (curr->next != NULL) {
curr = curr->next;
}
while (curr != NULL) {
fprintf(fp_out, "%d", curr->digit);
curr = curr->next;
}
fprintf(fp_out, "\n");
fclose(fp_out);
return 0;
}
```
在这个程序中,我们首先定义了一个 `node` 结构体,表示链表中的每个节点。我们还定义了 `create_node` 函数,用于创建一个新的节点。`create_list` 函数用于将一个字符串转换为链表。`add` 函数用于将两个链表相加,并返回结果链表。`multiply` 函数用于将两个链表相乘,并返回结果链表。最后,我们定义了 `print_list` 函数,用于打印链表中的数字。
在 `main` 函数中,我们从文件中读入输入,根据操作符调用加法或乘法函数,并将结果写入文件中。
阅读全文