大数减法
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; }
相关文章推荐
- 密码学之大数减法
- C语言大数运算-减法篇
- 大数加法、大数乘法、大数减法。Swift。
- 大数,高精度计算---大数减法
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- 高精度 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法? 并不是大数减法 坑爹的题目啊!!!
- 大数减法
- 大数减法运算
- C++实现大数的减法
- 大数运算(3)——大数减法
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- 大数乘法,大数加法,大数减法
- 2016中国大学生程序设计竞赛(长春) Ugly Problem 模拟+大数减法
- 大数运算——加法减法
- 大数运算——加法减法
- poj 3508 Hide That Number(模拟大数减法)