码迷,mamicode.com
首页 > 编程语言 > 详细

C++实现大数相乘

时间:2018-09-12 23:54:51      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:unit   字符串   std   names   需要   ace   图片   一个   space   

大意:用string 类型的两个大数进行相乘,输出结果

输入:样例一:-11  -11

 

   样例二:-15116516166564654646456456454655  121231312313214984894961116

输出:样例一:121

   样例二:-1832595092476562998391796185384824031048718264583442194980

思路:纯粹地模拟手动计算两个数相乘的过程即:

  1. 判断是否带负号,带负号则取出数值部分
  2. 以一个字符串的每一位去乘另一个字符串的每一,并用一个字符串保存结果
  3. 补齐第二步中得到字符串的低位,补充相应个数个0
  4. 将第三步中得到所有字符串进行相加
  5. 输出负号及第四步中得到的数值结果
#include <iostream>
#include <string>
using namespace std;

string max_i,min_i;

string count_add(string s1,string s2)					//进行两个数相加 
{
	max_i = s1;min_i = s2;
	if(s2.size()>s1.size())
	{
		max_i = s2;										//取长度大的数为max 
		min_i = s1;
	}
	
	for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--)		//模拟整数加的过程 
	{
		max_i[j] += min_i[i] -‘0‘;										//选择将结果保存在max变量中 
		
		if(max_i[j] > ‘9‘) 												//字符值大于9需要处理 
		{
			if(j > 0)
			{
				max_i[j - 1] ++;
				max_i[j] -= 10;
			}
			else
			{
				max_i = "1" + max_i;
				max_i[j] -= 10;
			}
		}
	}
	
	return max_i;
}

int main()
{
	string s1,s2;
	cin>>s1>>s2;

	int i,j;
	bool nega_s1 = false,nega_s2 = false;
	
	if(s1[0] == ‘-‘)								//若带负号,则取出数字部分 
	{
		nega_s1 = true; 
		s1 = s1.substr(1);							//将第一位开始的部分重新赋给s 
	} 
	
	if(s2[0] == ‘-‘)
	{
		nega_s2 = true; 
		s2 = s2.substr(1);
	}
	
	char unit, decade = ‘0‘;
	
	int a,b;
	string result_one[s2.size()];					//保存中间的s2的每一位乘s1的结果 
	
	for(i = s2.size()-1; i >= 0; i--)				//模拟相乘过程 
	{
		a = s2[i] - ‘0‘; 
		for(j = s1.size()-1; j >= 0; j--)
		{
			b = s1[j] - ‘0‘; 
			
			unit =((a * b) + decade - ‘0‘) % 10 + ‘0‘ ;		//保存两个数字相乘的个位、十位 
			decade = ((a * b) + decade - ‘0‘) / 10 + ‘0‘;

			result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ;
		}
		if(decade != ‘0‘)
			result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i];

		decade = ‘0‘;
	}
	
	for(i = 0; i < s2.size(); i++)					//对中间结果补齐位数 
	{
		for(j = i;j > 0; j--)
		{
			result_one[i] = result_one[i] + ‘0‘;
		}
	}
	
	string sum = "0";								//用sum变量保存最终结果 
	
	for(i = 0;i < s2.size(); i++)					 
	{		
		sum = count_add(sum,result_one[i]);			//相加
	}
	
	int tip = 0;
	
	for(i = 0; i < sum.size(); i++)					//找出非零的起始位置 
	{
		if(sum[i] == ‘0‘ )
		{
			tip ++;
		}
		else
			break;
	}	
	
	if(nega_s1 + nega_s2 == 1)						//输出符号 
		cout<<"-";
	
	for(i = tip ; i < sum.size(); i++)				//输出数字部分答案 
	{
		cout<<sum[i];
	}

	if(tip == sum.size())
		cout<<"0";
	
	return 0;
}

  补充:输出进行了一定处理,防止输出0001这样的结果(即不输出数字开始的0)

  运行截图如下

      技术分享图片

  再试试真正的大数相乘

  技术分享图片

C++实现大数相乘

标签:unit   字符串   std   names   需要   ace   图片   一个   space   

原文地址:https://www.cnblogs.com/z1223/p/9637995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!