Difference between revisions of "Directory:Derek Elder/Programs/ReadBigInt Modified"
MyWikiBiz, Author Your Legacy — Tuesday December 03, 2024
Jump to navigationJump to searchDerek Elder (talk | contribs) (start of page) |
Derek Elder (talk | contribs) (updating) |
||
Line 5: | Line 5: | ||
#include <iomanip> | #include <iomanip> | ||
using namespace std; | using namespace std; | ||
+ | |||
+ | const int MAX = 50; | ||
class BigInt | class BigInt | ||
Line 12: | Line 14: | ||
//Precondition:None. | //Precondition:None. | ||
//Postcondition:The two BigInts have been added together. | //Postcondition:The two BigInts have been added together. | ||
+ | friend BigInt operator*(const BigInt& num1, const BigInt& num2); | ||
+ | //Purpose:Operator overloaded, * operator will call MultBigInts. | ||
+ | //Precondition:None. | ||
+ | //Postcondition:The two BigInts have been multiplied together. | ||
friend ostream& operator<<(ostream& os, const BigInt& num); | friend ostream& operator<<(ostream& os, const BigInt& num); | ||
//Purpose:Operator overloaded, << operator will call PrintToBigInt. | //Purpose:Operator overloaded, << operator will call PrintToBigInt. | ||
Line 20: | Line 26: | ||
//Precondition:BigInts num1 and num2 are valid. | //Precondition:BigInts num1 and num2 are valid. | ||
//Postcondition:1.Return true if sum is valid. | //Postcondition:1.Return true if sum is valid. | ||
+ | // 2.Return false if there is overflow. | ||
+ | friend bool MultBigInts(const BigInt& num1, const BigInt& num2, BigInt& product); | ||
+ | //Purpose:Multiply two integers together into a product. | ||
+ | //Precondition:BigInts num1 and num2 are valid. | ||
+ | //Postcondition:1.Return true if product is valid. | ||
// 2.Return false if there is overflow. | // 2.Return false if there is overflow. | ||
friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum); | friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum); | ||
Line 27: | Line 38: | ||
// 2.If there is overflow (numDigits > MAX) it will be indicated in operator+. | // 2.If there is overflow (numDigits > MAX) it will be indicated in operator+. | ||
public: | public: | ||
− | static const int MAX = 5; | + | //static const int MAX = 5; |
BigInt(); | BigInt(); | ||
//Default Constructor | //Default Constructor | ||
Line 49: | Line 60: | ||
//Precondition:BigInt num is valid. | //Precondition:BigInt num is valid. | ||
//Postcondition:Data is printed on screen matching the way it was entered from the console. | //Postcondition:Data is printed on screen matching the way it was entered from the console. | ||
+ | bool ExtractGoodString(const string& input, string& output); | ||
+ | //Purpose:To make sure the goodstring is valid. | ||
+ | //Precondition:StringToBigInt has been called. | ||
+ | //Postcondition:A valid string is returned. | ||
private: | private: | ||
− | |||
− | |||
− | |||
− | |||
int Digits[MAX]; | int Digits[MAX]; | ||
int numDigits; | int numDigits; | ||
Line 73: | Line 84: | ||
void main() | void main() | ||
{ | { | ||
− | BigInt num1, num2 | + | BigInt num1, num2; |
bool moreNumbers = true; | bool moreNumbers = true; | ||
char update = ' '; | char update = ' '; | ||
Line 87: | Line 98: | ||
cout<<"The BigInt entered is: "; | cout<<"The BigInt entered is: "; | ||
num2.PrintBigInt(); | num2.PrintBigInt(); | ||
+ | cout<<"The product is: "<<num1 * num2; | ||
cout<<"The sum is: "<<num1 + num2; | cout<<"The sum is: "<<num1 + num2; | ||
} | } | ||
catch(OverFlowException ex) | catch(OverFlowException ex) | ||
{ | { | ||
− | cout<<"The sum has caused OVERFLOW"<<endl; | + | cout<<"The sum or product has caused OVERFLOW"<<endl; |
} | } | ||
− | cout<<"Do you wish to | + | cout<<"Do you wish to continue? "; |
cin>>update; | cin>>update; | ||
+ | cout<<"========================="<<endl; | ||
cin.ignore(50,'\n'); | cin.ignore(50,'\n'); | ||
if(update == 'Y' || update == 'y') | if(update == 'Y' || update == 'y') | ||
Line 120: | Line 133: | ||
getline(cin,inputString); | getline(cin,inputString); | ||
− | len = (int)inputString.length(); //Length of the string entered into len | + | len = (int)inputString.length(); //Length of the string entered into len. |
if(len > MAX) | if(len > MAX) | ||
Line 128: | Line 141: | ||
} | } | ||
else | else | ||
− | { | + | { |
StringToBigInt(inputString); | StringToBigInt(inputString); | ||
tooBig = true; | tooBig = true; | ||
Line 166: | Line 179: | ||
return true; | return true; | ||
} | } | ||
+ | } | ||
+ | bool MultBigInts(const BigInt& largest, const BigInt& smallest, BigInt& product) | ||
+ | { | ||
+ | int i, j, k; | ||
+ | int remainder; | ||
+ | BigInt temp, temp2; | ||
+ | bool flag; | ||
+ | |||
+ | temp.numDigits = 0; | ||
+ | temp2.numDigits = 0; | ||
+ | product.numDigits = 0; | ||
+ | |||
+ | for(i = 0; i < smallest.numDigits; i++) | ||
+ | { | ||
+ | remainder = 0; | ||
+ | temp2 = product; | ||
+ | |||
+ | if(temp2.numDigits >= MAX) | ||
+ | return false; | ||
+ | |||
+ | for(j = i; j > 0; j--) | ||
+ | { | ||
+ | temp.Digits[j - 1] = 0; | ||
+ | } | ||
+ | |||
+ | for(k = 0; k < largest.numDigits; k++) | ||
+ | { | ||
+ | temp.Digits[k + i] = smallest.Digits[i] * largest.Digits[k] + remainder; | ||
+ | |||
+ | if(temp.Digits[k + i] >= 10) | ||
+ | { | ||
+ | remainder = temp.Digits[k + i] / 10; | ||
+ | temp.Digits[k + i] = temp.Digits[k + i] % 10; | ||
+ | } | ||
+ | else | ||
+ | remainder = 0; | ||
+ | } | ||
+ | |||
+ | if(remainder >= 1) | ||
+ | { | ||
+ | temp.Digits[k + i] = remainder; | ||
+ | k++; | ||
+ | } | ||
+ | |||
+ | temp.numDigits = (k + i); | ||
+ | flag = AddBigInts(temp2,temp,product); | ||
+ | } | ||
+ | return flag; | ||
} | } | ||
void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum) | void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum) | ||
Line 222: | Line 283: | ||
for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers | for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers | ||
{ | { | ||
− | ch = str[i]; | + | ch = str[i]; //Convert from char to numeric value |
− | Digits[counter] = ch - '0'; //char c = '2'; | + | Digits[counter] = ch - '0'; //char c = '2'; |
− | counter++; | + | counter++; //int n = c - '0'; |
} | } | ||
} | } | ||
Line 237: | Line 298: | ||
else | else | ||
return sum; | return sum; | ||
+ | } | ||
+ | BigInt operator*(const BigInt& num1, const BigInt& num2) | ||
+ | { | ||
+ | BigInt product; | ||
+ | if(MultBigInts(num1,num2,product) == false) | ||
+ | { | ||
+ | OverFlowException ex(num1,num2,'*'); | ||
+ | throw ex; | ||
+ | } | ||
+ | else | ||
+ | return product; | ||
} | } | ||
ostream& operator<<(ostream& os, const BigInt& num) | ostream& operator<<(ostream& os, const BigInt& num) |
Latest revision as of 05:09, 6 December 2007
#include <iostream> #include <fstream> #include <string> #include <iomanip> using namespace std; const int MAX = 50; class BigInt { friend BigInt operator+(const BigInt& num1, const BigInt& num2); //Purpose:Operator overloaded, + operator will call AddBigInts. //Precondition:None. //Postcondition:The two BigInts have been added together. friend BigInt operator*(const BigInt& num1, const BigInt& num2); //Purpose:Operator overloaded, * operator will call MultBigInts. //Precondition:None. //Postcondition:The two BigInts have been multiplied together. friend ostream& operator<<(ostream& os, const BigInt& num); //Purpose:Operator overloaded, << operator will call PrintToBigInt. //Precondition:None. //Postcondition:The BigInt is printed. friend bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum); //Purpose:Add two integers together into a sum. //Precondition:BigInts num1 and num2 are valid. //Postcondition:1.Return true if sum is valid. // 2.Return false if there is overflow. friend bool MultBigInts(const BigInt& num1, const BigInt& num2, BigInt& product); //Purpose:Multiply two integers together into a product. //Precondition:BigInts num1 and num2 are valid. //Postcondition:1.Return true if product is valid. // 2.Return false if there is overflow. friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum); //Purpose:Modularize AddBigInts function to make it more efficent. //Precondition:BigInts num1 and num2 have been entered and contain good data. //Postcondition:1.Sum has been populated by good data as long as numDigits <= MAX. // 2.If there is overflow (numDigits > MAX) it will be indicated in operator+. public: //static const int MAX = 5; BigInt(); //Default Constructor //Purpose:Set numDigits to 0 to indicate an array is not populated. //Precondition:None. //Postcondition:Constructor has set numDigits to 0 indicating the array is not populated. BigInt(const string& goodString); //Constructor //Purpose:If num is intitalized in main with a value, the constructor calls StringToBigInt. //Precondition:None. //Postcondition:BigInt num has been converted from a string into an array. bool ReadBigInt(istream& is = cin); //default stream arg; ReadBigInt() means use "cin". //Purpose:Read a BigInt, deposit into a string and call StringToBigInt. //Precondition:None. //Postcondition:1.Array is populated, data is valid. // 2.BigInt is too large, loops until an Int is entered that is small enough. void PrintBigInt(ostream& os = cout) const; //default stream arg; PrintBigInt() means use "cout". //Purpose:Print a BigInt in the same way it was entered by reversing the way it was stored into the array. //Precondition:BigInt num is valid. //Postcondition:Data is printed on screen matching the way it was entered from the console. bool ExtractGoodString(const string& input, string& output); //Purpose:To make sure the goodstring is valid. //Precondition:StringToBigInt has been called. //Postcondition:A valid string is returned. private: int Digits[MAX]; int numDigits; }; class OverFlowException { public: BigInt m_num1, m_num2; char m_op; OverFlowException(const BigInt& num1,const BigInt& num2, char op) { m_num1 = num1; m_num2 = num2; m_op = op; } }; void main() { BigInt num1, num2; bool moreNumbers = true; char update = ' '; while(moreNumbers) { try { num1.ReadBigInt(); num2.ReadBigInt(); cout<<"The BigInt entered is: "; num1.PrintBigInt(); cout<<"The BigInt entered is: "; num2.PrintBigInt(); cout<<"The product is: "<<num1 * num2; cout<<"The sum is: "<<num1 + num2; } catch(OverFlowException ex) { cout<<"The sum or product has caused OVERFLOW"<<endl; } cout<<"Do you wish to continue? "; cin>>update; cout<<"========================="<<endl; cin.ignore(50,'\n'); if(update == 'Y' || update == 'y') { moreNumbers = true; } else { moreNumbers = false; } } cout<<"Program Terminated on request."<<endl; } bool BigInt::ReadBigInt(istream& is) { int len = 0; bool tooBig = false; string inputString = ""; while(!tooBig) //Initialize tooBig, if integer is too big loop until BigInt entered is valid. { cout<<"Enter an integer: "; getline(cin,inputString); len = (int)inputString.length(); //Length of the string entered into len. if(len > MAX) { cout<<"The number you entered is too big, try again!"<<endl; tooBig = false; } else { StringToBigInt(inputString); tooBig = true; } } return true; } void BigInt::PrintBigInt(ostream& os) const { int counter = numDigits - 1; for(int i = 0; i < numDigits; i++) { cout<<Digits[counter]; counter--; } cout<<endl; } bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum) { if(num1.numDigits >= num2.numDigits) { firstIntegerLarger(num1, num2, sum); } else { firstIntegerLarger(num2, num1, sum); } //If Overflow return false, otherwise return true if(sum.numDigits > MAX) { return false; } else { return true; } } bool MultBigInts(const BigInt& largest, const BigInt& smallest, BigInt& product) { int i, j, k; int remainder; BigInt temp, temp2; bool flag; temp.numDigits = 0; temp2.numDigits = 0; product.numDigits = 0; for(i = 0; i < smallest.numDigits; i++) { remainder = 0; temp2 = product; if(temp2.numDigits >= MAX) return false; for(j = i; j > 0; j--) { temp.Digits[j - 1] = 0; } for(k = 0; k < largest.numDigits; k++) { temp.Digits[k + i] = smallest.Digits[i] * largest.Digits[k] + remainder; if(temp.Digits[k + i] >= 10) { remainder = temp.Digits[k + i] / 10; temp.Digits[k + i] = temp.Digits[k + i] % 10; } else remainder = 0; } if(remainder >= 1) { temp.Digits[k + i] = remainder; k++; } temp.numDigits = (k + i); flag = AddBigInts(temp2,temp,product); } return flag; } void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum) { int i; int remainder = 0; for(i = 0; i < smallest.numDigits; i++) { sum.Digits[i] = largest.Digits[i] + smallest.Digits[i] + remainder; if(sum.Digits[i] >= 10) { sum.Digits[i] = (sum.Digits[i] - 10); remainder = 1; } else { remainder = 0; } } for(; i < largest.numDigits; i++) { sum.Digits[i] = largest.Digits[i] + remainder; if(sum.Digits[i] >= 10) { sum.Digits[i] = (sum.Digits[i] - 10); remainder = 1; } else { remainder = 0; } } if(i == largest.numDigits && remainder == 1) { sum.Digits[i] = 1; sum.numDigits = largest.numDigits + 1; } else { sum.numDigits = largest.numDigits; } } void BigInt::StringToBigInt(const string& goodString) { int counter = 0; string str = ""; str = goodString; numDigits = (int)str.length(); char ch = ' '; for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers { ch = str[i]; //Convert from char to numeric value Digits[counter] = ch - '0'; //char c = '2'; counter++; //int n = c - '0'; } } BigInt operator+(const BigInt& num1, const BigInt& num2) { BigInt sum; if(AddBigInts(num1,num2,sum) == false) { OverFlowException ex(num1,num2,'+'); throw ex; } else return sum; } BigInt operator*(const BigInt& num1, const BigInt& num2) { BigInt product; if(MultBigInts(num1,num2,product) == false) { OverFlowException ex(num1,num2,'*'); throw ex; } else return product; } ostream& operator<<(ostream& os, const BigInt& num) { num.PrintBigInt(os); return os; } BigInt::BigInt() :numDigits(0) {} BigInt::BigInt(const string& goodString) { StringToBigInt(goodString); }