用C语言采用线性表设计一个100位以内的长整数加减运算的程序。 要求如下: 1、输入输出要求:每四位一组,组间用逗号分隔。 2、加和减分别用不同的程序实现。 3、程序应考虑输入数据的符号。
时间: 2024-10-14 17:03:45 浏览: 67
线性表设计100位以内的长整数加减运算的程序
在C语言中,我们可以使用字符数组来模拟长整数的每一位,并通过遍历数组来进行加减运算。首先,我们创建结构体存储每一位数字以及其对应的符号,然后实现两个函数:`add_integers` 和 `subtract_integers` 分别用于加法和减法操作。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义长整数结构体,包括每位数字和符号
typedef struct {
char digit;
int sign;
} LongIntegerDigit;
// 函数声明
void add_digits(LongIntegerDigit* arr1, LongIntegerDigit* arr2, int len);
void subtract_digits(LongIntegerDigit* arr1, LongIntegerDigit* arr2, int len);
// 助手函数,将字符串转换成长整数数组
LongIntegerDigit* string_to_long(int str[], int len);
int main() {
char input[4][5] = {"", "", "", ""}; // 存储用户输入的四位数
char output[4][5]; // 输出结果
// 输入处理
for (int i = 0; i < 4; ++i) {
printf("请输入第%2d位(0-%d): ", i + 1, 9); // 从0到9
fgets(input[i], sizeof(input[i]), stdin);
input[i][strcspn(input[i], "\n")] = '\0'; // 移除换行符
}
// 将字符串转换为长整数数组
LongIntegerDigit* arr1 = string_to_long(input, 4);
LongIntegerDigit* arr2 = string_to_long(input + 1, 4); // 假设第二个输入是在第一个基础上增加一位
// 加法运算
add_digits(arr1, arr2, 4);
printf("加法结果: ");
for (int i = 3; i >= 0; --i) {
output[i * 2] = arr1[i].digit + '0';
if (arr1[i].sign == -1 && arr1[i].digit != '9') {
arr1[i].digit++;
arr1[i].sign = 1;
}
if (output[i * 2] > '9') { // 如果进位
output[(i * 2) + 1] = '1';
arr1[i].digit = 0;
arr1[i].sign = 1;
} else {
output[(i * 2) + 1] = '\0';
}
}
// 减法运算
subtract_digits(arr1, arr2, 4);
printf("\n减法结果: ");
for (int i = 3; i >= 0; --i) {
output[i * 2] = arr1[i].digit + '0';
if (arr1[i].sign == 1 && arr1[i].digit != '0') {
arr1[i].digit--;
arr1[i].sign = -1;
}
if (output[i * 2] < '0') { // 如果借位
output[(i * 2) + 1] = '9';
arr1[i].digit = 9;
arr1[i].sign = -1;
} else {
output[(i * 2) + 1] = '\0';
}
}
printf("%s\n", output);
free(arr1);
return 0;
}
// 转换字符串数组到长整数数组
LongIntegerDigit* string_to_long(char str[], int len) {
LongIntegerDigit* arr = (LongIntegerDigit*) malloc(len * sizeof(LongIntegerDigit));
int sign = 1;
for (int i = 0; i < len; ++i) {
arr[i].digit = str[i] - '0';
if (str[i] == '- 1].sign *= sign; // 只对最后一个元素应用符号
return arr;
}
// 加和减函数核心实现,这里仅列出大致步骤,实际实现会更复杂
void add_digits(LongIntegerDigit* arr1, LongIntegerDigit* arr2, int len) {
// 遍历数组并处理加法
for (int i = 0; i < len; ++i) {
arr1[i].digit += arr2[i].digit;
if (arr1[i].sign == 1 && arr2[i].sign == 1 && arr1[i].digit > 9) { // 正正相加可能进位
arr1[i].digit -= 10;
arr1[i].sign = 1;
}
if (arr1[i].sign == -1 && arr2[i].sign == -1 && arr1[i].digit < 0) { // 负负相加可能借位
arr1[i].digit += 10;
arr1[i].sign = -1;
}
}
}
void subtract_digits(LongIntegerDigit* arr1, LongIntegerDigit* arr2, int len) {
// 类似于加法,但要考虑借位
for (int i = 0; i < len; ++i) {
arr1[i].digit -= arr2[i].digit;
if (arr1[i].sign == 1 && arr2[i].sign == 1 && arr1[i].digit < 0) { // 正正相减需要借位
arr1[i].digit += 10;
arr1[i].sign = -1;
}
if (arr1[i].sign == -1 && arr2[i].sign == -1 && arr1[i].digit > 0) { // 负负相减不需要借位
arr1[i].digit -= 10;
arr1[i].sign = 1;
}
}
}
```
阅读全文