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

大数相乘的实现

发布时间:2020-12-14 02:21:08 所属栏目:大数据 来源:网络整理
导读:??????? 一般所说的大数即超出了系统所支持的最大类型的整形的表示范围,对于这种大的数不能用整形类型来表示,只能通过string 类型来表示。对于两个用string 类型来表示的大数,其乘法实现按两个数相乘的一般法则来实现。返回类型也用string 类型来表示。 /

??????? 一般所说的大数即超出了系统所支持的最大类型的整形的表示范围,对于这种大的数不能用整形类型来表示,只能通过string 类型来表示。对于两个用string 类型来表示的大数,其乘法实现按两个数相乘的一般法则来实现。返回类型也用string 类型来表示。

//两个string 进行相加(按各位字符所对应的整数值)
string execadd(string s1,string s2){
	int len1 = s1.length() - 1;
	int len2 = s2.length() - 1;

	string result;
	char curbit;
    bool carry = false;

	while(len1 >= 0 && len2 >= 0){
		 curbit = s1[len1] + s2[len2] - '0';
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len1--;
		 len2--;
	}
	while(len1 >= 0){
		curbit = s1[len1];
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len1--;
	}

	while(len2 >= 0){
		curbit = s2[len2];
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len2--;
	}

	if(carry){
	     string tmp;
		 tmp += '1';
		 tmp += result;
		 result = tmp;
	}
    return result;
}

//string 和 char 相乘
string computechar(string str,char ch){
	string result = "";
	int len = str.length() - 1;
	char curbit;
	int carry = 0;

	while(len >= 0){
		curbit = (((str[len] - '0') * (ch - '0')) + carry) % 10 + '0'; 
		carry = (((str[len] - '0') * (ch - '0')) + carry) / 10;
	    string tmp = "";
		tmp += curbit;
		tmp += result;
		result = tmp;
		len--;
	}
	if(carry){
	    curbit = carry  % 10 + '0';
		string tmp = "";
		tmp += curbit;
		tmp += result;
		result = tmp;
		if(carry / 10){
		    curbit = carry / 10 + '0';
			string tmp = "";
			tmp += curbit;
			tmp += result;
			result = tmp;
		}
	}
    return result;
}

//实现乘法的逻辑
string execcompute(string s1,string s2){
	int len1 = s1.length();
	int len2 = s2.length();
	string result = "";
	string tmp = "";
	int base = 0;

	for(int i = len2 - 1; i >= 0; i--){
		tmp = computechar(s1,s2[i]);
		for(int i = 0 ; i < base; i++){
		    tmp += '0';
		}
		result = execadd(result,tmp);
		base++;
	}
	return result;
}

int main(){
	string s1,s2;
	while(cin >> s1 >> s2){
		int len1 = s1.length();
		int len2 = s2.length();
    
		string result;
		if(len1 < len2){
			result = execcompute(s2,s1);
		}else{
			result = execcompute(s1,s2);
		}

		cout << "s1: " << s1 << "		"<< "s2: " << s2 << "		";
		cout << "multi: "<< result << endl;
	}

	return 0;
}


???????? 下面给出一组测试输出,其中有一些非常大的数,这些树相乘只能通过大数相乘的思路来实现。



??

(编辑:李大同)

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

    推荐文章
      热点阅读