栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ - 大整数减法(重载运算符)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ - 大整数减法(重载运算符)

利用vector与重载运算符实现大整数减法

 

#include
#include
#include
using namespace std;
vector a,b; // 存储大整数,高位存储在高位
//重载-同时满足大整数与大整数、与整数的减法 
//大整数-大整数, 一定是大数-小数,1、长度不同,b比a长,则添加负号再交换a和b;2、长度相同,则按位比较。 
vector operator -(vector a, vector b){  
	vector ans; //记录输出结果 
	if(a.size() < b.size()){ // a < b, 输出负号并交换 
		cout <<"-";
		swap(a,b);
	}
	// a与b长度一致,从高位开始比较,任一位小于b则输出负号并交换 
	else if(a.size() == b.size()){ 
		for(int i = a.size() - 1; i >= 0; --i)
			if(a[i] < b[i]){
				cout<<"-"; 
				swap(a,b);
				break;
			}
	}
	int temp = 0; //表示当前结果 
	for(int i = 0;  i < b.size(); ++i){  
		temp = a[i] - b[i];
		if(temp < 0){ //不够减时,借位 
			a[i + 1]--;
			temp += 10;
		}
		ans.push_back(temp);
	} 
	//相减不存在最高位进位问题
	//由于a中始终存储较大、较长的数,故可能要将a中剩余位数放入ans
	for(int i = ans.size(); i < a.size(); ++i)
		ans.push_back(a[i]);
	//消除先导0,且i>0即遇到ans = 000……0的情况,保留一位,答案输出0 
	for(int i = ans.size() - 1; ans[i] == 0 && i >0; --i)
		ans.pop_back(); 
	return ans;
} 
int main(){
	vector a = {5,7,6,5}, b = {9,7,8,8},ans;
	ans = a - b;
	for(int i = ans.size() - 1; i >= 0; --i)
		cout << ans[i];
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969179.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号