一、题目
求两个大的正整数相减的差。
二、思路
1.接收输入的两个大整数的数字串:
用string接收两个正整数的数字串(C用字符数组或字符指针);
2.比较两个正整数哪个大?
(1)比较两个大整数的数字串长度;
(2)如果长度相等,可用strcmp函数比较两个数字串,头文件为:#include <cstring>;
如果是第一个数大于或等于第二个数,那差是非负整数;否则为负数,负数要输出符号“-”,同时交换两个
数字串:让较大的数字串是第一个数,较小的为第二个数
3.将两个大整数的数字串分别存放在整型数组a和b中:从低位往高位存放
a存放较大的数,b存放较小的数
4.然后,从低位往高位进行相减,不够的从高位借位;
a = a - b;
5.最后输出结果。
三、实现程序
#include <iostream>
#include <string>
using namespace std;
const int MAX = 5000;
typedef int Arr[MAX]; // 使用别名
bool isLarge(string str1, string str2, int la, int lb); // 比较两个数字串的大小
void toMinus(Arr a, Arr b, int &la, int lb); // 将两个高精度数相减 a = a - b
int main(int argc, const char * argv[]) {
string str1, str2, temp;
int la, lb, i, tempab; // 存储数字串的长度
Arr a, b;
cout << "请输入两个大整数(用空格隔开):" << endl;
while(cin >> str1 >> str2) {
la = (int)str1.size(); // 获取字符串的长度
lb = (int)str2.size();
// 比较两个数字串的大小
// (1)比较长度:短的就小,长的大;
// (2)长度相等,就比较高位第一位,小的就小,大的就大,相等则
// 比较低一位,重复类似。
// 逆置数字串:根据数字与ASCII码的关系
// 把数字从低位到高位存到整数数组中
// 也可以用比较大小函数strcmp进行比较,头文件为:#include <cstring>
// 这里我为了让初学者明白原理,所以自己写了比较函数
cout << "这两个整数之差为:" << endl;
// 调用自定义比较函数:比较两个数字串的大小
bool isFlag = isLarge(str1, str2, la, lb);
if(isFlag) { // 第一个高精度数大于第二个,交换
// 交换数字串a,b
temp = str1;
str1 = str2;
str2 = temp;
// 交换数字串长度
tempab = la;
la = lb;
lb = tempab;
cout << "-"; // 负数要输出符号"-"
}
// 清零
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for(i = 0; i < la; i++) {
a[la-i-1] = str1[i] - '0';
}
for(i = 0; i < lb; i++) {
b[lb-i-1] = str2[i] - '0';
}
toMinus(a, b, la, lb); // 调用求差函数
for(i = 0; i < la; i++)
cout << a[la - i - 1];
cout << endl;
}
return 0;
}
// 比较两个数字串的大小,如果第一个数小于第二个数,就返回true并交换两个数字串。
bool isLarge(string str1, string str2, int la, int lb) {
if(la < lb) // 长度小于第二个,第二个数大
return true;
else if(la == lb) {
// 从高位开始比较,直到不同;
while(str1[la-1] == str2[lb-1]) {
la--;
lb--;
}
if(str1[la-1] < str2[lb-1]) // 如果第一个小于第二个,返回真
return true;
}
return false;
}
// 将两个高精度数相减 a = a - b; 返回la的长度
void toMinus(Arr a, Arr b, int &la, int lb) {
int i;
for(i = 0; i < la; i++) { // 逐位相减
if(a[i] < b[i]) { // 不够减则要借位
a[i+1]--;
a[i] = a[i] + 10;
}
a[i] = a[i] - b[i]; // 计算出差的第i位
}
while(la > 1 && a[la-1] == 0) // 从高位往低位走,直到不为0
la--;
}测试结果:

版权声明:本文为chuanzhouxiao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。