用c语言编写一个程序,设定一个主菜 单,可以选择加减乘除其中的一个,从 键盘输入最高100位的长整数,并对其 进行上一步所选择的运算,输出结果
时间: 2023-11-12 22:08:25 浏览: 48
以下是一个简单的用C语言编写的计算器程序,可以进行加减乘除运算,支持最高100位的长整数输入。
```c
#include <stdio.h>
#include <string.h>
// 用数组模拟长整数
typedef struct {
int len;
int num[100];
} BigInt;
// 从字符串中读取长整数
BigInt readBigInt(char *str) {
BigInt n;
n.len = strlen(str);
for (int i = 0; i < n.len; i++) {
n.num[i] = str[n.len - i - 1] - '0'; // 从低位到高位存储
}
return n;
}
// 输出长整数
void printBigInt(BigInt n) {
for (int i = n.len - 1; i >= 0; i--) {
printf("%d", n.num[i]); // 从高位到低位输出
}
printf("\n");
}
// 长整数加法
BigInt add(BigInt a, BigInt b) {
BigInt c;
int carry = 0;
for (int i = 0; i < a.len || i < b.len; i++) {
int x = i < a.len ? a.num[i] : 0;
int y = i < b.len ? b.num[i] : 0;
int sum = x + y + carry;
c.num[i] = sum % 10;
carry = sum / 10;
}
if (carry > 0) {
c.num[c.len++] = carry;
}
return c;
}
// 长整数减法(要求a>=b)
BigInt sub(BigInt a, BigInt b) {
BigInt c;
int borrow = 0;
for (int i = 0; i < a.len; i++) {
int x = a.num[i] - borrow;
int y = i < b.len ? b.num[i] : 0;
if (x < y) {
x += 10;
borrow = 1;
} else {
borrow = 0;
}
c.num[i] = x - y;
if (c.num[i] > 0) {
c.len = i + 1;
}
}
return c;
}
// 长整数乘法
BigInt mul(BigInt a, BigInt b) {
BigInt c;
c.len = a.len + b.len;
memset(c.num, 0, sizeof(c.num));
for (int i = 0; i < a.len; i++) {
for (int j = 0; j < b.len; j++) {
c.num[i + j] += a.num[i] * b.num[j];
c.num[i + j + 1] += c.num[i + j] / 10;
c.num[i + j] %= 10;
}
}
while (c.len > 1 && c.num[c.len - 1] == 0) {
c.len--;
}
return c;
}
// 长整数除法(要求b>0)
BigInt div(BigInt a, BigInt b) {
BigInt c;
c.len = a.len;
memset(c.num, 0, sizeof(c.num));
BigInt r = {0};
for (int i = a.len - 1; i >= 0; i--) {
r = mul(r, (BigInt){.len = 1, .num = {10}});
r.num[0] = a.num[i];
while (r.len > 1 && r.num[r.len - 1] == 0) {
r.len--;
}
while (compare(r, b) >= 0) {
c.num[i]++;
r = sub(r, b);
}
}
while (c.len > 1 && c.num[c.len - 1] == 0) {
c.len--;
}
return c;
}
// 比较两个长整数的大小(返回-1、0、1分别表示a<b、a=b、a>b)
int compare(BigInt a, BigInt b) {
if (a.len < b.len) {
return -1;
} else if (a.len > b.len) {
return 1;
} else {
for (int i = a.len - 1; i >= 0; i--) {
if (a.num[i] < b.num[i]) {
return -1;
} else if (a.num[i] > b.num[i]) {
return 1;
}
}
return 0;
}
}
int main() {
char op;
char str[101];
BigInt a, b, c;
printf("请输入一个长整数:");
scanf("%s", str);
a = readBigInt(str);
printf("请选择操作符(+、-、*、/):");
scanf(" %c", &op); // 注意这里需要加一个空格,避免读入回车符
printf("请输入另一个长整数:");
scanf("%s", str);
b = readBigInt(str);
switch (op) {
case '+':
c = add(a, b);
break;
case '-':
if (compare(a, b) >= 0) {
c = sub(a, b);
} else {
printf("减法结果为负数!");
return 1;
}
break;
case '*':
c = mul(a, b);
break;
case '/':
if (compare(b, (BigInt){.len = 1, .num = {0}}) == 0) {
printf("除数不能为0!");
return 1;
}
c = div(a, b);
break;
default:
printf("不支持的操作符!");
return 1;
}
printf("结果为:");
printBigInt(c);
return 0;
}
```
注意事项:
- 由于C语言没有内置的长整数类型,因此我们使用结构体来模拟长整数。
- 由于长整数可能非常大,我们需要用数组来存储每一位的数字。为了方便起见,我们从低位到高位存储,这样在进行加法、减法、乘法和除法时可以更方便地处理进位和借位。
- 在进行减法时,我们要求被减数大于等于减数,否则结果会是负数。
- 在进行除法时,我们要求除数不能为0,否则会出现除0错误。
- 在进行输入时,我们用了一个技巧,即在%c前面加一个空格,这样可以忽略掉前面的回车符。