/****************************************** Advanced Algorithm Assignment 1 by Ming Cao Jan. 2002 This program is coded to apply the large Fibonacci numbers using the algorithm based on Question 3 (Exercise 7.8). It includes an implementation of large nonnegative integers, a function for multiplying 2 by 2 matrices and an O(log n) function for computing the nth power of a 2 by 2 matrix. Two classes were defined: class Integer and class Matrix for nonnegative integers and and 2 by 2 matrices, *******************************************/ #include #include #include #include #define MAX 100 #define MAXDIGI 100 #define MAX_SIZE 100 class Integer { private: char value[MAX_SIZE]; int Intsize; public: //initializer Integer(); Integer(char *); //overridding the operator = Integer& operator=(const Integer); Integer& operator=(const int); Integer& operator=(const char*); //overridding the operator +, * and == friend Integer operator+ (Integer, Integer); friend Integer operator* (Integer, Integer); friend int operator==(Integer, Integer); friend ostream& operator<<(ostream&, const Integer); int len() {return Intsize;} int isEven() { return value[0]%2 == 0; } //Half applies the n/2 Integer Half() { Integer tmp=*this; for(int i=Intsize-1; i>0; i--) { tmp.value[i-1] += (tmp.value[i]%2)*10; tmp.value[i] /= 2; } tmp.value[0] /= 2; tmp.Intsize = tmp.value[Intsize-1]==0 ? Intsize-1 : Intsize; return tmp; } }; Integer::Integer() { // initializer memset(value,0,sizeof(char)*MAX_SIZE); Intsize=1; } Integer::Integer(char *str) { memset(value, 0, MAX_SIZE*sizeof(char)); Intsize = strlen(str); for (int i=Intsize;i>0;i--)value[Intsize-i]=str[i-1]-48; } Integer& Integer::operator= (const Integer tmp) //operator overridiing { memset(value, 0, MAX_SIZE*sizeof(char)); Intsize=tmp.Intsize; for(int i=0; i0; i--) value[Intsize-i] = str[i-1]-48; return *this; } Integer operator+ (Integer A, Integer B) //operator overridiing { Integer C; int largest = (A.Intsize>B.Intsize ? A.Intsize : B.Intsize); int result=0, carry=0; for (int i=0; i 9) { result -= 10; carry = 1; } else carry = 0; C.value[i] = result; } if (carry == 1 && largest0 && i+j+k < MAX; k++) { //need carriage if(i+j+k+1 < MAX) tmp[i+j+k+1] += tmp[i+j+k]/10; tmp[i+j+k] %= 10; } } } i = A.Intsize+B.Intsize>100 ? 100 : A.Intsize+B.Intsize; intTmp.Intsize = tmp[i-1] == 0 ? i-1 : i; //? for(i=0;i0; i--) out << (char)(intTmp.value[i-1]+48); return out; } /****************************** Matrix definition *****************************/ class Matrix { private: Integer m2x2[2][2]; public: Matrix(); Matrix(const int A, const int B, const int C, const int D); Matrix& operator=(const Matrix); friend Matrix operator* (Matrix, Matrix); void print() { cout<