C++實現大數相乘


大意:用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)

  運行截圖如下

      

  再試試真正的大數相乘

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM