您的位置:首页 > 其它

大数减法

2019-08-18 12:34 645 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhangxt_/article/details/99703411

分析思路

  • 大数减法的基本思想和大数加法一样,都是存储成数组的形式,按位进行计算
  • 大数减法的特殊性在于不够减时候的借位

代码实现

关键逻辑见注释

#include<iostream>
#include<cstring>
using namespace std;
//用字符串比较方式判断两个数的大小
bool stringcmp(char *p1, char *p2) {
if (strlen(p1) > strlen(p2)) return true;
if (strlen(p1) == strlen(p2)) {
if (strcmp(p1, p2) > 0) return true;
}
return false;
}

int *sub(int *ans, char *a, char *b) {
int len1 = strlen(a);
int len2 = strlen(b);
int *tmp1 = (int *) calloc(0, sizeof(int) * 100);
int *tmp2 = (int *) calloc(0, sizeof(int) * 100);
ans[0] = len1;
//字符转数字
for (int i = 1; i <= len1; ++i) {
tmp1[i] = a[len1 - i] - '0';
}
for (int i = 1; i <= len2; ++i) {
tmp2[i] = b[len2 - i] - '0';
}

int bit = 0; // 定义一个错位变量
for (int i = 1; i <= len1; ++i) {
if (tmp1[i] - bit >= tmp2[i]) {
ans[i] = tmp1[i] - tmp2[i] - bit;
bit = 0;
} else {
ans[i] = tmp1[i] + 10 - tmp2[i] - bit;
bit = 1;
}
//去前置零
if (i == len1 && ans[len1] == 0 && i > 1) {
ans[0]--;
}
}
return ans;
}
//二维指针交换两个字符串的值
void string_swap(char **x, char **y) {
char *tmp;
tmp = *x;
*x = *y;
*y = tmp;
return;
}

int main() {
char num1[100] = {0};
char num2[100] = {0};
cin >> num1 >> num2;
int *ans = (int *) calloc(0, sizeof(int) * 100);
if (!stringcmp(num1, num2)) {
char *n1 = num1;
char *n2 = num2;
string_swap(&n1,&n2);
ans = sub(ans, n1, n2);
for (int i = ans[0]; i >= 1; i--) {
i == ans[0] && cout << "-";
cout << ans[i];
}
} else {
ans = sub(ans, num1, num2);
for (int i = ans[0]; i >= 1; i--) {
cout << ans[i];
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: