C++实现两个大数相减
2016-09-14 21:37
363 查看
两个大数相减。(1)首先是数据输入的问题,采用字符创输入的形式;(2)其次需要比较两个数据的大小,两个数相减会有正负号的问题,若a>b,则有a-b=-(b-a),计算出b-a的值,然后在字符串的前面加上"-"即可,转换成大数减去小数的问题;(3)最后需要考虑的问题也是最核心的问题,两个数相减的过程。从两个数的末位开始,这涉及到借位的问题,字符向数字转化,数字向字符转化的问题等。下面来看它们的具体实现。
比较两个字符串的大下
比较两个字符创的大小,首先看两个字符串的长度,长度越长,显然数据越大;其次如果长度相同,则从头到尾顺次比价对应位置的字符的大下。具体实现如下:
2. 两个数相减的实现
两个数相减,主要涉及到借位和数字和字符的转化的问题,然后相减是分别从两个大数的末端开始的。具体的实现如下。
3. 最后输入输出问题
输入的两个大数据采用,采用字符创的形式,开始不知道最后的结果的大下,最后的结果存放在new开辟的堆内存中,具体实现如下:
4. 输出结果
比较两个字符串的大下
比较两个字符创的大小,首先看两个字符串的长度,长度越长,显然数据越大;其次如果长度相同,则从头到尾顺次比价对应位置的字符的大下。具体实现如下:
/大于或者等于返回为true,小于返回为false/ bool isGreat(string chara, string charb) { int lena = chara.length(); int lenb = charb.length(); if (lena > lenb) return true; else if (lena < lenb) return false; else { int n = lena; int i = 0; for (; i < n; i++) { if (chara[i]>charb[i]) return true; else if (chara[i] < charb[i]) return false; } if ((i == n) && chara[i - 1] == charb[i - 1]) return true; } return false; }
2. 两个数相减的实现
两个数相减,主要涉及到借位和数字和字符的转化的问题,然后相减是分别从两个大数的末端开始的。具体的实现如下。
void differValue(string astr, string bstr,char* cstr) { int overflow = 0; //借位标志,有借位时设置值为-1 int i, j; for ( i = (astr.length()-1),j=bstr.length()-1; i >=0,j>=0; i--,j--) { if ((astr[i] + overflow) < bstr[j]) { cstr[i] = (astr[i] - '0') + overflow + 10 - (bstr[j] - '0')+'0'; overflow = -1; } else { cstr[i] = (astr[i] - '0') - (bstr[j] - '0')+'0'; overflow = 0; } } while (i>=0) //只剩下一个数的时候 { if ((astr[i]-'0' + overflow)<0) { cstr[i] = astr[i] + overflow + 10; overflow = -1; } else { cstr[i] = astr[i]; } i--; } }
3. 最后输入输出问题
输入的两个大数据采用,采用字符创的形式,开始不知道最后的结果的大下,最后的结果存放在new开辟的堆内存中,具体实现如下:
int main() { string stra,strb; cin >> stra >> strb; int n = stra.length() > strb.length() ? stra.length() : strb.length(); char* result=new char ; memset(result, -1, n); if (isGreat(stra, strb)) { differValue(stra, strb, result); } else { //结果字符串的 第一位作为符号位,如果结果为负,应该存放"-" result[0] = '-'; differValue(strb, stra, result+1); } for (unsigned int j = 0; j<strlen(result); j++) { if (result[j] != '-1') //最后输出的时候,忽略字符为空的情况 { cout << result[j]; } } delete[] result; }
4. 输出结果
相关文章推荐
- C++实现的一个简单两个大数相加程序!
- 面试题之自创 实现两个整型大数(都是正数)的相减操作
- 两个大数相乘的C++实现
- 杭电oj1002即用c++实现两个大数相加
- C++实现——两个大数相乘
- 如何在C++中实现求两个整数的最大公约数和最小公倍数(转)
- 大数乘法C++实现
- 求两个大整数(大于32位)的乘积的C++实现代码
- [CodeProject每日一荐] 两个C++实现的MSN Messenger弹出窗口风格的窗体
- C语言实现两个大数相乘问题
- 【C++】两个大数相加之HuaWei上机
- c++ 连接两个字符串,实现类似strcat 功能
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 两个栈实现队列C++代码
- 两个c++编译器对c++对象模型和虚函数调用方式的实现
- C++版大数相加:字符串实现
- [转] 一个大数相乘的C/C++实现
- C++实现大数阶乘
- c++ 两个栈实现队列
- 用C++实现设计模式---两个迭代器的传说