1. 程式人生 > >資料結構 第二章 順序表應用舉例——大整數求和

資料結構 第二章 順序表應用舉例——大整數求和

一、問題描述

C/C++語言中的int型別能表示的整數範圍是-2^31~2^31-1,unsigned int型別能表示的整數範圍是0~2^32-1,即0~4 294 967 295,所以,int和unsigned int型別都不能儲存超過10位的整數。有些問題需要處理的整數遠遠不止10位,這種大整數用C/C++語言的基本資料型別無法直接表示。請編寫演算法完成兩個大整數的加、減、乘和除等基本代數運算。

二、基本要求

①大整數的長度在100位以下;

②設計儲存結構表示大整數;

③設計演算法實現兩個大整數的加、減、乘和除等基本的代數運算;

④分析演算法的時間複雜度和空間複雜度。

三、問題分析

因為C++中的基本型別無法儲存100位的整數,所以需要自定義一個類來儲存。由整數的性質可知,一個整數由在其各個位上的元素構成,每個元素之間僅有前後關係。用線性表就能很好的的表示大整數的邏輯結構。

從大整數的代數運算方面來看,各種運算僅會影響元素本身、元素的鄰位(進位、退位),沒有中間插入元素的操作。元素的個數上限也是事先規定好的。因此,用順序表表(陣列)作為其儲存結構。

四、資料型別定義

標頭檔案LongInt.h

#ifndef LongInt_H
#define LongInt_H
const int MaxSize = 100;
class LongInt
{
public:
	LongInt(){ length = 0; }
	LongInt(int a[], int n);                  //建構函式
	~LongInt(){};                         
	friend LongInt Add(LongInt a, LongInt b); //加法函式
	void PrintList();                         //輸出結果
private:
	int data[MaxSize];
	int length;
};
#endif

五、C++程式碼段

原始碼檔案LongInt.cpp

<pre class="cpp" name="code"><em>#include <iostream>
#include <algorithm>
#include "LongInt.h"
using namespace std;

//建構函式,將存入的大整數的高位置入自定義型別陣列的低位
//主要其倒置陣列的作用
LongInt::LongInt(int a[], int n)
{
	length = n;
	if (length > MaxSize)throw"引數非法";
	n--;
	for (int i = 0; i < length; i++)
	{
		data[n - i] = a[i];
	}
}

//加法函式,實現兩個大整數相加,處理進位
LongInt Add(LongInt A, LongInt B)
{
	int flag = 0,i = 0,n,m;
	LongInt C;
	n = A.length;
	m = B.length;
	while (i<n&&i<m)
	{
		C.data[i] = (A.data[i] + B.data[i] + flag) % 10;
		flag = (A.data[i] + B.data[i] + flag) / 10;
		i++;
	}
	for (; i < n; i++)
	{
		C.data[i] = (A.data[i] + flag) % 10;
		flag = (A.data[i] + flag) / 10;
	}
	for (; i < m; i++)
	{
		C.data[i] = (B.data[i] + flag) % 10;
		flag = (B.data[i] + flag) / 10;
	}
	C.length = max(m, n) + flag;
	if (flag == 1)
		C.data[C.length - 1] = 1;
	return C;
}

//遍歷陣列,倒置並迴圈輸出大整數
void LongInt::PrintList()
{
	for (int i = length - 1; i > -1; i--)
		cout << data[i];
	cout << endl;
}</em>

原始碼檔案LongInt_main.cpp

<em>#include <iostream>
#include <string>
#include "LongInt.h"
using namespace std;

int main()
{
	string a, b;
	int ai[MaxSize],bi[MaxSize];
	cout << "請輸入第一個大整數" << endl;
	cin >> a;
	cout << "請輸入第二個大整數" << endl;
	cin >> b;
	int lena = a.size();
	int lenb = b.size();
	for (int i = 0; i < lena; i++) //將兩個字串轉換為整型陣列
	{
		ai[i] = a[i]-48;
	}
	for (int i = 0; i < lena; i++)
	{
		bi[i] = b[i]-48;
	}
	LongInt A(ai, lena), B(bi, lenb);
	LongInt C;
	C=Add(A,B);              //進行加法運算                   
	cout << "結果為" << endl;
	C.PrintList();           //輸出結果
	return 0;
}
</em>

六、執行結果

進行40位,無進位,兩相加數位數相等運算

運算結果1

進行50位,有進位,兩相加數位數相等運算

運算結果2

進行100位,有進位,兩相加數位數不相等運算

運算結果3

七、總結

目前僅實現了大整數加法,且出現了Bug。有空再實現其餘代數運算並DeBug。