用C语言实现大整数减法#include <stdio.h> #include <string.h> #define MAX_LEN 1000 // 定义最大长度 int main() { char a[MAX_LEN + 1], b[MAX_LEN + 1]; int ans[MAX_LEN + 1]; // 定义字符串数组 int lena, lenb, lens, flag = 0; // lena为a的长度,lenb为b的长度,lens为结果的长度,flag为标志位 // 输入两个整数 scanf("%s %s", &a, &b); lena = strlen(a); lenb = strlen(b); // 分三种情况 if (lena < lenb || (lena == lenb && strcmp(a, b) < 0)) { char temp[MAX_LEN + 1]; strcpy(temp, a); strcpy(a, b); strcpy(b, temp); flag = 1; } lens = lena > lenb ? lena : lenb; int i = lena - 1, j = lenb - 1, k = lens - 1; int borrow = 0; // 定义借位变量 while (i >= 0 || j >= 0) { int x = i >= 0 ? a[i] - '0' : 0; int y = j >= 0 ? b[j] - '0' : 0; int z = x - y - borrow; if (z < 0) { z += 10; borrow = 1; } else { borrow = 0; } ans[k--] = z + '0'; i--; j--; } // 去除前导零 while (ans[lens - 1] == '0' && lens > 1) { lens--; } // 输出结果 if (flag) { printf("-"); } for (i = 0; i < lens; i++) { printf("%d", ans[i]); } printf("\n"); return 0; }中存在的问题
时间: 2024-02-14 20:32:39 浏览: 74
这段代码实现了大整数减法,但存在以下几个问题:
1. 输入没有进行合法性检查,当输入非数字字符时会导致程序出错。
2. 没有检查输入的数字是否超过了最大长度 MAX_LEN,可能会导致程序出错。
3. 字符串数组 ans 没有初始化,可能会导致输出错误结果。
4. 在比较两个字符串大小时使用了 strcmp 函数,效率较低,可以使用逐位比较来实现。
5. 输出结果时使用了字符数组 ans,但最终结果可能需要超过 MAX_LEN 个数字字符,可能会导致输出错误结果。可以使用动态内存分配来解决这个问题。
相关问题
用C语言编写大整数减法(字符串输入)
以下是用C语言编写大整数减法的示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000 // 定义最大位数
// 将字符串逆序存储
void reverse(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
// 大整数减法
char* bigIntSub(char *num1, char *num2) {
static char result[MAX_LEN]; // 存储结果的字符串
int len1 = strlen(num1);
int len2 = strlen(num2);
reverse(num1);
reverse(num2);
int carry = 0, i = 0;
for (; i < len2; i++) {
int sub = num1[i] - num2[i] - carry;
if (sub < 0) {
sub += 10;
carry = 1;
} else {
carry = 0;
}
result[i] = sub + '0';
}
for (; i < len1; i++) {
int sub = num1[i] - '0' - carry;
if (sub < 0) {
sub += 10;
carry = 1;
} else {
carry = 0;
}
result[i] = sub + '0';
}
for (i = len1 - 1; i > 0 && result[i] == '0'; i--); // 去掉前导0
result[i + 1] = '\0';
reverse(result);
return result;
}
int main() {
char num1[MAX_LEN], num2[MAX_LEN]; // 输入的两个大整数
printf("请输入第一个数:\n");
scanf("%s", num1);
printf("请输入第二个数:\n");
scanf("%s", num2);
char *result = bigIntSub(num1, num2);
printf("结果为:%s\n", result);
return 0;
}
```
示例运行截图:
```
请输入第一个数:
1234567890123456789012345678901234567890
请输入第二个数:
987654321098765432109876543210
结果为:1234567890123456788024691352469135808640
```
大整数减法c语言代码
当处理大整数减法时,我们需要考虑两个大整数的长度以及借位的情况。以下是一个简单的C语言代码示例,用于实现大整数减法:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void reverse(char* str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
void subtract(char* num1, char* num2, char* result) {
int len1 = strlen(num1);
int len2 = strlen(num2);
// 反转两个大整数
reverse(num1);
reverse(num2);
int borrow = 0;
int i;
for (i = 0; i < len2; i++) {
int diff = (num1[i] - '0') - (num2[i] - '0') - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
result[i] = diff + '0';
}
// 处理较长的大整数剩余的位数
for (; i < len1; i++) {
int diff = (num1[i] - '0') - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
result[i] = diff + '0';
}
// 去除结果前面的0
while (result[i - 1] == '0' && i > 1) {
i--;
}
result[i] = '\0';
// 反转结果
reverse(result);
}
int main() {
char num1[MAX_LEN];
char num2[MAX_LEN];
char result[MAX_LEN];
printf("请输入第一个大整数:");
scanf("%s", num1);
printf("请输入第二个大整数:");
scanf("%s", num2);
subtract(num1, num2, result);
printf("结果为:%s\n", result);
return 0;
}
```
请注意,此代码仅适用于非负整数的减法运算。如果需要处理负数或更复杂的情况,请根据具体需求进行修改。
阅读全文