1. 程式人生 > >C++學習--整型大數加法

C++學習--整型大數加法

無論整型還是長整型,都有它的極限,但有時需要運算很大的數,超過整型的極限。那就需要用字串儲存加數,再進行運算。

在C++學習的環境下,我把寫的函式都封裝在一個類中,提供一個函式介面供外部使用。

我的思想是:找出兩個數較長的,來確定結果字串的長度,預留一位進位,所以結果字串的長度會比兩個加數的長度大1,最後判斷是否去掉首位的字元0。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>

//大數加法
class intaddint
{
private:
	char *str1;
	char *str2;
	//封裝為私有
	void cmp_str();//比較兩個加數哪個更長
	void int_sum(char *, char *);//計算結果
public:
	intaddint(char *, char *);
	void get_res();
	~intaddint();
};

intaddint::intaddint(char *str1, char *str2)
{
	this->str1 = new char[100];//分配記憶體
	this->str2 = new char[100];
	memset(this->str1, 0, 100);//清空
	memset(this->str2, 0, 100);
	strcpy(this->str1, str1);//拷貝要進行運算的數
	strcpy(this->str2, str2);
}
void intaddint::cmp_str()
{
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	std::cout << str1 << '+' << str2;
	if (len1 >= len2)
		int_sum(str1, str2);
	else
		int_sum(str2, str1);
}
void intaddint::int_sum(char *longstr, char *shortstr)//長加數放在前面
{
	int len1 = strlen(longstr);
	int len2 = strlen(shortstr);
	//轉化成數字進行運算
	for (int i = 0; i < len1; i++)
		longstr[i] -= '0';
	for (int i = 0; i < len2; i++)
		shortstr[i] -= '0';
	char res[100] = { 0 };
	int str1_index = len1 - 1;//加數1索引
	int str2_index = len2 - 1;//加數2索引
	int res_index = len1;//結果的索引,預留一位進位
	for (; str2_index >= 0; str2_index--, str1_index--)
	{
		res[res_index] += longstr[str1_index] + shortstr[str2_index];
		if (res[res_index] >= 10)//進位
		{
			res[res_index - 1] += res[res_index] / 10;//取出進位的值
			res[res_index] %= 10;//取模
		}
		res_index--;
	}
	if (len1 != len2)//兩個加數位數不同需要加上沒有進行運算的數
	{
		while (str1_index >= 0)
		{
			res[res_index] += longstr[str1_index];
			if (res[res_index] >= 10)//進位
			{
				res[res_index - 1] += res[res_index] / 10;//取出進位的值
				res[res_index] %= 10;//取模
			}
			res_index--;
			str1_index--;
		}
	}
	for (res_index = 0; res_index < len1 + 1; res_index++)//再轉為字元數字
		res[res_index] += '0';
	res_index = 0;
	while (res[res_index] == '0')//去掉前面的字元'0'
		res_index++;
	char res_t[100] = { 0 };
	int t_index = 0;
	for (; res_index < len1 + 1; res_index++, t_index++)//用新的字串儲存結果
		res_t[t_index] = res[res_index];
	std::cout << '=' << res_t << std::endl;
}
void intaddint::get_res()
{
	cmp_str();
}
intaddint::~intaddint()
{
	delete[]str1;//清空記憶體
	delete[]str2;
	str1 = NULL;//防止野指標
	str2 = NULL;
}
void main()
{
	char *str1 = "12345678910111213";
	char *str2 = "12345678910";
	intaddint i(str1, str2);
	i.get_res();
	system("pause");
}