1. 程式人生 > >大數相加演算法,基於C++

大數相加演算法,基於C++

自己在做藍橋杯題目是,發現了很多需要大數計算的演算法,查閱相關資料,東西冗雜,決定自己寫演算法。

先做大數相加演算法。

兩個相加的大數的極限就是編譯器字串能接納位數的極限。

採用C++中得string類作為容器。首先準備三個容器,str1與str2接受資料,result接納相加結果,原理就是模擬加法的手工計算,先從低位開始相加,若超過10則進1。

其中有很多細節性問題,我列舉一下:

  • 1、str1要作為位數最長的一個,方便計算,因此要首先確保str1位數最長,可以通過兩數交換實現。
  • 2、result初始狀態的長度要與str1相同,但是在運算過程中可能發生兩數相加,結果長度超過了其中最長的一位,比如900+300,很顯然,結果是4位,這種結果的出現只可能是兩個位數相同的數相加才可能發生,而且最多超出1位。因此我們必須考慮到這種情況,解決辦法如果是我們發現了最高位需要進位,則令result = ‘1’+   result;將1放在首位就解決了。另外在最後輸出我們的字串的長度為length + 1,因為我們可能最高位進位了,長度+1,就算沒有進位,也沒有關係,我們將輸出一個\0,也就是空字元。

下面是程式碼,演算法比較粗糙,大家有意見,及時指正。

#include<iostream>
#include<string>

using namespace std;

int main()
{
	int i = 0, j = 0;
	string temp = "0";
	string str1;
	string str2;
	cin>>str1>>str2; //接受資料 
	if(str1.length() < str2.length())
	{
	//交換兩個字串,使位數長的位於str1 
		temp = str1;
		str1 = str2;
		str2 = temp;
	}
	long length1 = str1.length();
	long length2 = str2.length();
	long length = length1;
	string result(length, '0');

	//兩數相加,超過10進1 
	for(i = length - 1, j = length2 - 1; i >= 0 && j >= 0; i--, j--)
	{
		long sum = 0;
		sum = (str2[j] - '0') + (str1[i] - '0') + (result[i] - '0');
		if(sum > 9)
		{
			sum %= 10;
			result[i] = sum + '0'; 
			if(i != 0)
			result[i-1] = '1';
			else
			result = '1' + result;
		}
		else
		{
			result[i] = sum + '0';
		}
	}
	
	//str2的長度小於str1的話,將剩餘的str1加到result上 
	for(;i >= 0; i--)
	{
		long sum = 0;
		sum = (str1[i] - '0') + (result[i] - '0');
		if(sum > 9)
		{
			sum %= 10;
			{
				result[i] = (sum + 1) + '0'; 
			}
			result[i-1] = '1';
		}
		else
		{
			result[i] = sum + '0';
		}
	}
	
//輸出結果,注意length+1 
	for(i = 0; i < length + 1; i++)
		cout<<result[i];
	return 0;	
}