2021.9.7數據結構實驗課作業

利用順序表實現大整數的加法和乘法
類似競賽的高精度加法算法
第一份代碼比較簡潔,第二份代碼套用了課本模板

#include <iostream>
using namespace std;

class Array{
private:
	static const int Size = 100000;
	int len;
	int arr[Size+5];//實際上可以用short甚至char類型減小空間複雜度 
public:
	Array(){ len = 0;}
	Array(int n, int a[]) {
		if(n > Size) throw "Too big!";
		len = n;
		for(int i=0; i<n; ++i)
			arr[i] = a[i];
	}
	~Array(){}

	void plus(int n, int b[]) {
		/*
		cout << "Testing plus" << endl;
		for(int i=n-1; i>=0; --i)
			cout << b[i];
		cout << endl;
		*/
		
		if(n > Size) throw "Too big!";
		if(n > len) len = n;
		for(int j, i=0; i<len; ++i) {
			j = min(i, n);
			arr[i] += b[j];
			if(arr[i] > 9) {
				arr[i] -= 10;
				++arr[i+1];
			}
		}
		if(arr[len]>0) ++len;
		/*
		cout << "Testing plus" << endl;
		for(int i=len-1; i>=0; --i)
			cout << arr[i];
		cout << endl;
		*/
		return ;
	}

	void times(int n, int b[]) {
		int m = len*n*10;//防止運算結果太大爆數組 
		if(m >= Size) throw "Too big!";
		int *c = new int [m];//預製一個大數組存結果 
		for(int i=0; i<m; ++i)
			c[i] = 0;
		for(int i=0; i<n; ++i)
			for(int j=0; j<len; ++j) {
				c[i+j] += b[i] * arr[j];
				if(c[i+j] > 9) {
					c[i+j+1] += c[i+j]/10;
					c[i+j] %= 10;
				}
			}
		while(c[m-1] == 0) --m;//防止做的太大 
		while(c[m]>0) {
			if(c[m] > 9) {
				c[m+1] += c[m]/10;
				c[m] %= 10;
			}
			++m;
		}
		len = m;
		for(int i=0; i<m; ++i)
			arr[i] = c[i];
		delete []c;
		return ;
	}

	void print() {
		cout << "Testing:" << endl;
		cout << "len: " << len << endl;
		for(int i=len-1; i>=0; --i)
			cout << arr[i];
		cout << endl;
		return ;
	}
};

int main(void) {
	ios::sync_with_stdio(false);
	int n, m;
	int a[100] = {0}, b[100] = {0};
	cin >> n;
	for(int i=n-1; i>=0; --i)
		cin >> a[i];
	Array test1(n, a), test2(n, a);

	//大整數加法 
	cin >> m;
	for(int i=m-1; i>=0; --i)
		cin >> b[i];
	test1.plus(m, b);
	test1.print();
	//大整數乘法 
	cin >> m;
	for(int i=m-1; i>=0; --i)
		cin >> b[i];
	test2.times(m, b);
	test2.print();
	return 0;
}
#include <iostream>
#define MaxSize 1000

using namespace std;

template <typename T>
class SeqList
{
public:
    SeqList();
    SeqList(T a[], int n);
    ~SeqList();
    void PrintList();
    int GetLength();
    void GetData(T b[]);
    void Add(T b[], int n);
    void Mult(T b[], int n);
private:
    T data[MaxSize];
    int length;
};

template <typename T>
SeqList<T>::SeqList()
{
    length = 0;
}

template <typename T>
SeqList<T>::SeqList(T a[], int n)
{
    if(n>MaxSize)
        throw "Parameters of illegal.";
    for(int i=0; i<n; i++)
        data[i] = a[i];
    length = n;
}

template <typename T>
SeqList<T>::~SeqList()
{
    //empty
}

template <typename T>
void SeqList<T>::PrintList()
{
    cout << "This list is " << length << " digit." << endl;
    cout << "List element:";
    for(int i=length-1; i>=0; i--)
    {
        cout<<data[i]<<"  ";
    }
    cout<<endl;
}

template <typename T>
int SeqList<T>::GetLength()
{
    return length;
}

template <typename T>
void SeqList<T>::GetData(T b[])
{
    for(int i=0; i<length; i++)
		b[i]=data[i];
}

/*
template <typename DataType>
void SeqList<DataType>::Add(SeqList<DataType> A, SeqList<DataType> B)
{
    DataType a3[MaxSize], a4[MaxSize];
    A.GetData(a3), B.GetData(a4);
    int length3 = A.GetLength(), length4 = B.GetLength();
    int Max = max(length3, length4);

    if(Max > length3)
    {
        int temp = Max - length3;
        for(int i = 0; i < Max; i++)
        {
            a3[i+temp] = a3[i];
        }
        for(int i = 0; i < temp; i++)
        {
            a3[i] = 0;
        }
    }
    if(Max > length4)
    {
        int temp = Max - length4;
        for(int i = 0; i < Max; i++)
        {
            a4[i+temp] = a4[i];
        }
        for(int i = 0; i < temp; i++)
        {
            a4[i] = 0;
        }
    }

    for(int i = 0; i < Max; i++)
    {
        data[i] = a3[i] + a4[i];
        if(data[0] > 10)
        {
            length = ++Max;
        }
        if(data[i] > 9)
        {
            ++data[i - 1];
            data[i] -= 10;
        }
    }
}

template <typename DataType>
void SeqList<DataType>::Mult(SeqList<DataType> A, SeqList<DataType> B)
{

}
*/

template <typename T>
void SeqList<T>::Add(T b[], int n)
{
    if(n > MaxSize) throw "Too big!";
	if(n > length) length = n;
	for(int j, i=0; i<length; ++i) {
		j = min(i, n);
		data[i] += b[j];
		if(data[i] > 9) {
			data[i] -= 10;
			++data[i+1];
		}
	}
	if(data[length]>0) ++length;

    cout << "Add A and B:" << endl;
    cout << "This list is " << length << " digit." << endl;
    cout << "List element:";
    for(int i=length-1; i>=0; i--)
        cout << data[i] << "  ";
    cout << endl;
}

template <typename T>
void SeqList<T>::Mult(T b[], int n)
{
	cout << "Testing" << endl;
    int m = n*length*10;
	if(m >= MaxSize) throw "Too big!";
    T *c = new T [m];
    for(int i=0; i<m; i++)
        c[i]=0;
    for(int i=0; i<n; ++i)
        for(int j=0; j<length ; j++)
        {
            c[i+j] += data[j] * b[i];
            if(c[i+j]>9)
            {
                c[i+j+1] += c[i+j]/10;
                c[i+j] %= 10;
            }
        }
	
	while(c[m-1] == 0) --m;//防止做的太大 
	while(c[m]>0) {
		if(c[m]>9) {
			c[m+1] += c[m]/10;
			c[m] %= 10;
		}
		++m;
	}
	length = m;
	for(int i=0; i<m; ++i)
		data[i] = c[i];
	delete []c;
    cout << "Mult A and B:" << endl;
    cout << "This list is " << length << " digit." << endl;
    cout << "List element:";
    for(int i=m-1; i>=0; i--)
        cout << data[i] << "  ";
    cout << endl;
}

int main()
{
    int n1,n2,a1[MaxSize],a2[MaxSize];
    cout << "Please input length of list A:";
    cin >> n1;
    cout << "Please input element of list A:";
    for(int i=n1-1; i>=0; i--)
        cin >> a1[i];
    SeqList<int> A(a1,n1);

    cout << "Please input length of list B:";
    cin >> n2;
    cout << "Please input element of list B:";
    for(int i=n2-1; i>=0 ; i--)
        cin >> a2[i];
    SeqList<int> B(a2,n2);

    A.PrintList();
    B.PrintList();

    A.Add(a2, n2);
    B.Mult(a1, n1);

    /*
    SeqList<int> C,D;
    cout << "Add A and B:" << endl;
    C.Add(A,B);
    C.PrintList();
    cout << "Mult A and B:" << endl;
    D.Mult(A,B);
    D.PrintList();
    */

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章