資料結構 第二章 順序表應用舉例——大整數求和
阿新 • • 發佈:2019-01-06
一、問題描述
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位,無進位,兩相加數位數相等運算
進行50位,有進位,兩相加數位數相等運算
進行100位,有進位,兩相加數位數不相等運算
七、總結
目前僅實現了大整數加法,且出現了Bug。有空再實現其餘代數運算並DeBug。