void bigSub(char a[], char b[], char result[]) { int borrow = 0; int i; int lenA = strlen(a); int lenB = strlen(b); reverse(a); reverse(b); for (i = 0; i < lenA || i < lenB; i++) { if (i >= lenA) a[i] = '0'; if (i >= lenB) b[i] = '0'; if (a[i] - borrow >= b[i]) { result[i] = a[i] - borrow - b[i] + '0'; borrow = 0;//不借位 } else { result[i] = a[i] + 10 - borrow - b[i] + '0'; borrow = 1;//借位 } } result[lenA > lenB ? lenA : lenB] = '\0'; reverse(result); }解释一下这个代码
时间: 2023-05-12 14:03:04 浏览: 81
这是一个实现大数相减的函数,输入两个大数 a 和 b,输出它们的差 result。函数中使用了借位的方法来实现相减。具体来说,先将 a 和 b 翻转过来,然后从低位到高位逐位相减,如果 a[i] 大于等于 b[i],则直接相减,否则需要向高位借位。最后再将结果翻转回来即可。
相关问题
用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; }中存在的问题
这段代码实现了大整数减法,但存在以下几个问题:
1. 输入没有进行合法性检查,当输入非数字字符时会导致程序出错。
2. 没有检查输入的数字是否超过了最大长度 MAX_LEN,可能会导致程序出错。
3. 字符串数组 ans 没有初始化,可能会导致输出错误结果。
4. 在比较两个字符串大小时使用了 strcmp 函数,效率较低,可以使用逐位比较来实现。
5. 输出结果时使用了字符数组 ans,但最终结果可能需要超过 MAX_LEN 个数字字符,可能会导致输出错误结果。可以使用动态内存分配来解决这个问题。
#include <iostream> #include <cstring> using namespace std; #define MAX_LENGTH 100 // 高精度加法 string add(string num1, string num2) { string res = ""; // 存放结果 int carry = 0; // 存放进位 int len1 = num1.size(); int len2 = num2.size(); // 从低位到高位逐位相加 for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) { int a = i >= 0 ? num1[i] - '0' : 0; int b = j >= 0 ? num2[j] - '0' : 0; int sum = a + b + carry; carry = sum / 10; res = to_string(sum % 10) + res; } while (res.size()>1 && res[0]=='0') { res.erase(0,1); } if (carry > 0) { res = to_string(carry) + res; } return res; } // 高精度减法 string sub(string num1, string num2) { string res = ""; // 存放结果 int borrow = 0; // 存放借位 int len1 = num1.size(); int len2 = num2.size(); // 从低位到高位逐位相减 for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) { int a = i >= 0 ? num1[i] - '0' : 0; int b = j >= 0 ? num2[j] - '0' : 0; int diff = a - b - borrow; if (diff < 0) { diff += 10; borrow = 1; } else borrow = 0; res = to_string(diff) + res; } // 去掉前导0 while (res.size()>1 && res[0]=='0') { res.erase(0,1); } // 如果结果为0,则去掉负号 if (res == "0") { borrow = 0; } // 加上负号 if (borrow > 0) { res = "-" + res; } return res; } int main() { string num1, num2, op; cin >> num1 >> op >> num2; if (op == "+") { cout << add(num1, num2) << endl; } else if (op == "-") { cout << sub(num1, num2) << endl; } return 0; }这段程序没有考虑被减数小于减数的情况,请改正他使其能够正确返回被减数小于减数时的结果
可以在执行高精度减法时,判断被减数是否小于减数,如果是则交换两个数的位置,并在最终结果前加上负号即可。修改后的代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
#define MAX_LENGTH 100
// 高精度加法
string add(string num1, string num2) {
string res = "";
int carry = 0;
int len1 = num1.size();
int len2 = num2.size();
for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) {
int a = i >= 0 ? num1[i] - '0' : 0;
int b = j >= 0 ? num2[j] - '0' : 0;
int sum = a + b + carry;
carry = sum / 10;
res = to_string(sum % 10) + res;
}
while (res.size()>1 && res[0]=='0') {
res.erase(0,1);
}
if (carry > 0) {
res = to_string(carry) + res;
}
return res;
}
// 高精度减法
string sub(string num1, string num2) {
string res = "";
int borrow = 0;
int len1 = num1.size();
int len2 = num2.size();
bool negative = false; // 是否为负数
if (len1 < len2) { // 如果被减数长度小于减数长度,则交换两个数的位置
swap(num1, num2);
len1 = num1.size();
len2 = num2.size();
negative = true; // 标记为负数
} else if (len1 == len2) { // 如果两个数长度相等,则从高位到低位比较大小
for (int i = 0; i < len1; i++) {
if (num1[i] < num2[i]) {
swap(num1, num2);
len1 = num1.size();
len2 = num2.size();
negative = true; // 标记为负数
break;
} else if (num1[i] > num2[i]) {
break;
}
}
}
for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) {
int a = i >= 0 ? num1[i] - '0' : 0;
int b = j >= 0 ? num2[j] - '0' : 0;
int diff = a - b - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
res = to_string(diff) + res;
}
while (res.size()>1 && res[0]=='0') {
res.erase(0,1);
}
if (negative) { // 如果是负数,则在最终结果前加上负号
res = "-" + res;
}
return res;
}
int main() {
string num1, num2, op;
cin >> num1 >> op >> num2;
if (op == "+") {
cout << add(num1, num2) << endl;
} else if (op == "-") {
cout << sub(num1, num2) << endl;
}
return 0;
}
```
阅读全文