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

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

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

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

用vector存储大整数并重载运算符

 

#include
#include
#include
using namespace std;
//大整数 / 整数。处理负号,最高位存储正负数,遵循负负得正等原则处理 
//当a比b大时,商是整数无需特殊处理;
//当a比b小时,商是小数,输出“0.”
//除数为0,则直接输出即可 
vector operator / (vector a, int b){
	int len = 0, temp = b; //记录b的长度,先比长度,再比大小 
	while(temp){
		len++;
		temp/=10;
	}
	int flag = 0, p = pow(10,len-1); //记录商是否为整数、1或小数, 整数 =1,小数=-1 
	//进行负号的处理 
	if(a[a.size() - 1] * b < 0) cout << "-";
	if(a[a.size() - 1] < 0) a[a.size() - 1] *= -1;
	if(b < 0) b *= -1;
	if(a.size() > len) flag = 1; //a比b大,商为整数 
	else if(a.size() == len){ //长度相等时 
		int temp = b;
		for(int i = a.size() - 1;i >= 0; --i, temp %= p, p/=10){
			int cur = temp/p;
			if(a[i] > cur){//a比b大,跳出,商为整数 
				flag = 1;
			 	break;
			}
			else if(a[i] < cur){
				flag = -1;
				break;//a比b小,进行处理 
			} 
		}
	}
	vector ans;
	int rest = 0;//余数,计算时,每次将余数*10 
	for(int i = a.size() - 1; i >= 0; --i){
		rest = rest * 10 + a[i];
		ans.insert(ans.begin(), rest /b); //注意insert(iterator_pos,...) 
		rest = rest % b;
	}
	//当商为整数时,需要消除先导0 
	if(flag >= 0){
		for(int i = ans.size() - 1; ans[i] == 0 && i > 0; --i)
			ans.pop_back();
	}
	//商为小数时,a << b,应当输出0,不应该输出0.000, 
	else{
		bool iszero = true;
		for(int i = 0; i < ans.size(); ++i) //从低位开始更容易发现有效数位 
			if(ans[i]){
				iszero = false;
				break;
			}
		if(iszero){
			ans.clear();
			ans.push_back(0);
		}
		else 	cout << "0.";
	} 
	return ans;
} 
int main(){
	vector a = {5,7,9,4}, ans;
	int b = 589;
	if(!b){
		cout <<"INFn";
		return 0;
	}
	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/968679.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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