Difference between revisions of "Directory:Derek Elder/Programs/ReadBigInt Modified"
MyWikiBiz, Author Your Legacy — Tuesday November 04, 2025
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);
}