加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数加减法总结

发布时间:2020-12-14 02:58:58 所属栏目:大数据 来源:网络整理
导读:大数加减法总结(包括整数或者负数): 1、先解决不带符号的数的加减法 2、根据加数或者减数的符号位判断该选择加法还是减法计算,并且赋予结果对应的符号 需要注意的是:不带符号的减法产生的结果可能高位为‘0’,要进行处理。 string bigNumberMinusWitho

大数加减法总结(包括整数或者负数):

1、先解决不带符号的数的加减法

2、根据加数或者减数的符号位判断该选择加法还是减法计算,并且赋予结果对应的符号

需要注意的是:不带符号的减法产生的结果可能高位为‘0’,要进行处理。

string bigNumberMinusWithoutSign(const char* num1,const char *num2){
	string res = "";
	
	bool flag1 = false; // 正负标志位
	int flag = 0;//退位标志

	const char* p1,*p2;
	p1 = num1,p2 = num2;
	int len1 = strlen (p1);
	int len2 = strlen (p2);
	int index1 = len1 - 1;
	int index2 = len2 - 1;


	if(len1 < len2 ||len1==len2&&strcmp (num1,num2) < 0){
		flag1 = true;
		p1 = num2;
		p2 = num1;
		index1 = len2 - 1;
		index2 = len1 - 1;
	}
	// 处理减法
	while(index1 >= 0 && index2 >= 0){

		if(p1[index1]+flag > p2[index2]){
			res = char(p1[index1]+flag-p2[index2]+'0') + res;
			flag = 0;
		}
		else if(p1[index1]+flag == p2[index2]){
			res = char('0') + res;
			flag = 0;
		}
		else{
			res = char(p1[index1]+flag+10-p2[index2]+'0') + res;
			flag = -1;
		}
		--index1,--index2;
	}

	// 处理较大数的剩余位
	while(index1 >= 0){
		if(flag + p1[index1] < '0'){
			res = char(flag + p1[index1] + 10) + res;
			flag = -1;
		}
		else{
			res =char(flag + p1[index1]) + res;
			flag = 0;
		}
		--index1;
	}

	int zeroCount = 0;
	for(int k = 0; k < res.length (); ++k){
		if(res[k] == '0')
			++zeroCount;
		else
			break;
	}
	res.erase (0,zeroCount);
	if(res.length () == 0)
		return res;
	
	if(flag1 == true)
		res = char('-') + res;
	return res;
}

string bigNumberAddWithoutSign(const char *num1,const char *num2)
{
	string res = "";
	if(!num1 || !num2)
		return res;

	const char *p1,*p2;

	p1 = num1,p2 = num2;
	int len1 = strlen (p1);
	int len2 = strlen (p2);
	int index1 = len1 - 1;
	int index2 = len2 - 1;

	if(len1 < len2){
		p1 = num2;
		p2 = num1;
		index1 = len2 - 1;
		index2 = len1 - 1;
	}

	int flag = 0; //进位标志位
	int temp;
	while(index1 >=0 && index2 >=0){
		temp = flag + p1[index1] + p2[index2] - 2*'0';
		if(temp >= 10)
			flag = 1;
		else
			flag = 0;
		res = char(temp % 10 + '0') + res;
		--index1,--index2;
	}

	while(index1 >= 0){
		temp = flag + p1[index1] - '0';
		if(temp >= 10)
			flag = 1;
		else
			flag = 0;
		res = char(temp % 10 + '0') + res;
		--index1;
	}
	return res;
}

string bigNumberAdd(const char *num1,const char *num2)
{
	bool sign1 = true;
	bool sign2 = true;
	
	const char *p1 = num1;
	const char *p2 = num2;

	if(*p1 == '-'){
		sign1 = false;
		++p1;
	}
	else if(*p1 == '+')
		++p1;

	if(*p2 == '-'){
		sign2 = false;
		++p2;
	}
	else if(*p2 == '+')
		++p2;
	

	string res;
	if(sign1 && sign2)
		return bigNumberAddWithoutSign (p1,p2);
	else if(sign1 && !sign2)
		return bigNumberMinusWithoutSign (p1,p2);
	else if(!sign1 && sign2)
		return bigNumberMinusWithoutSign (p2,p1);
	else{
		res = bigNumberAddWithoutSign (p1,p2);
		res = char('-') + res;
		return res;
	}
}

string bigNumberMinus(const char *num1,const char *num2)
{
	bool sign1 = true;
	bool sign2 = true;
	const char *p1 = num1;
	const char *p2 = num2;

	if(*p1 == '-'){
		sign1 = false;
		++p1;
	}
	else if(*p1 == '+')
		++p1;

	if(*p2 == '-'){
		sign2 = false;
		++p2;
	}
	else if(*p2 == '+')
		++p2;

	if(sign1 && sign2)
		return bigNumberMinusWithoutSign (p1,p2);
	else if(sign1 && !sign2)
		return bigNumberAddWithoutSign (p1,p2);
	else if(!sign1 && sign2){
		string res = bigNumberAddWithoutSign (p1,p2);
		res = char('-') + res;
		return res;
	}
	else
		return bigNumberMinusWithoutSign (p2,p1);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读