8 Replies - 16249 Views - Last Post: 20 March 2010 - 07:53 AM Rate Topic: -----

#1 drmsndrgns   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 8
  • Joined: 10-March 08

HugeInteger Class Subtraction error

Post icon  Posted 20 April 2008 - 07:46 PM

Hello all!
I am working on a homework assignment that is suppose to do the following: Create a class HugeInteger that uses a 40-element array of digits to store integers as large as 40 digits each. Provide member functions input, output add, subtract, and multiply. For comparing HugeInteger objects, provide functions isEqualTo, isNotEqualTo, isGreaterThan, isLessThan, isGreaterThanOrEqualTo and isLessThanOrEqualTo--each of these is a "predicate" function that simply returns true if the relationship holds between the two HugeIntegers and returns false if the relationship does not hold. Also, provide a predicate function isZero.

Right now I am stuck on the Subtraction function. I have looked and looked, but I just can't seem to figure out what the problem is and my brain cells seem to be fried right now. I am receiving the following errors:

hugeinteger.cpp(107) : error C2784: 'bool std::operator >(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'HugeInteger'
c:\program files\microsoft visual studio 8\vc\include\xutility(1888) : see declaration of 'std::operator >'
hugeinteger.cpp(107) : error C2784: 'bool std::operator >(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'HugeInteger'
c:\program files\microsoft visual studio 8\vc\include\utility(85) : see declaration of 'std::operator >'
hugeinteger.cpp(107) : error C2676: binary '>' : 'HugeInteger' does not define this operator or a conversion to a type acceptable to the predefined operator


here is my header file:
#ifndef HUGEINTEGER_H
#define HUGEINTEGER_H

class HugeInteger {
public:
	HugeInteger();	// default constructor

	void input();	// function input
	void output();	// function output
	HugeInteger add (HugeInteger, HugeInteger );	// function add
	HugeInteger subtract (HugeInteger, HugeInteger);	// function subtract
	HugeInteger multiply (HugeInteger, HugeInteger);	// function multiply

	bool isEqualTo (const HugeInteger &);	// predicate function isEqualTo
	bool isNotEqualTo (const HugeInteger &);	// predicate function isNotEqualTo
	bool isGreaterThan (const HugeInteger &);	// predicate function isGreaterThan
	bool isLessThan	(const HugeInteger &);	// predicate function isLessThan
	bool isGreaterThanOrEqualTo (const HugeInteger &);	// predicate function isGreaterThanOrEqualTo
	bool isLessThanOrEqualTo (const HugeInteger &);	// predicate function isLessThanOrEqualTo
	bool isZero;

private:
	char digitArray[40];
	int Padding();		// to account for remainder of 40 digits that have no number with a 0
	bool error;
};	// end class HugeInteger_H

#endif


Here is my cpp file with the classes and the main for right now..

#include <iostream>
#include <cstring>
#include <cstdlib>
#include "HugeInteger.h"

using namespace std;

HugeInteger::HugeInteger() {
	for (int element = 0; element < 40; element++) {
		digitArray[element] = '0';
		digitArray[40] = '\0';
	}	// end for loop
	error = false;
}	// end constructor

int HugeInteger::Padding() {	// to cover for the remainder of the array
	int element;
	for (element = 0; element < sizeof digitArray - 2; element++) {
		if (digitArray[element] == '0') {
		}	// end if statement
		else {
			break;
		}	// end else statement
	}	// end for loop
	return element;
}	// end int Padding

void HugeInteger::input() {		// read value from user to set HugeInteger
	char inputString[40];
	int element = 0;

	cin.getline(inputString, sizeof inputString, '\n');

	if (!error) {
		element = (int) strlen(inputString);

		while (element >= 0) {
			digitArray[40 - strlen(inputString) + element] = inputString[element];
			element--;
		}	// end while loop
	}	// end if statement
}	// end function input

void HugeInteger::output() {
	if (!error) {
		for (int element = Padding(); element < sizeof digitArray; element++) {
			cout << digitArray[element];
		}	// end for loop
	}	// end if statement
	else {
		cout << "There has been an error." << endl;
	}	// end else statement
}	// end function output


HugeInteger HugeInteger::add (HugeInteger firstNumber, HugeInteger secondNumber)  {
	int element = 0, hold = 0, firstTemporary = 0, secondTemporary = 0, result = 0, value = 0;
	HugeInteger final;

	if (!firstNumber.error && !secondNumber.error) {
		element = sizeof digitArray - 1;
		while (element >= 0) {
			firstTemporary = firstNumber.digitArray[element]-'0';
			secondTemporary = secondNumber.digitArray[element]-'0';
			result = firstTemporary + secondTemporary + hold;
			hold = result / 10;
			value = result % 10;
			final.digitArray[element] = value + '0';
			element--;
		}	// end while loop
		if (hold > 0) {			// to catch an overflow
			for (int element = 0; element < 40; element++) {
				digitArray[element] = '0';
				digitArray[40] = '\0';
			}	// end for loop
			final.error = true;
		}	// end if statement
	}	// end if statement
	else {
		final.error = true;
	}	// end else statement

	return final;
}	// end function add

HugeInteger HugeInteger::subtract (HugeInteger firstNumber, HugeInteger secondNumber) {
	int element = 0, firstTemporary = 0, secondTemporary = 0, result = 0, copy = 0;
	HugeInteger final;

	element = sizeof digitArray - 1;

	if (!firstNumber.error && !secondNumber.error) {
		if (firstNumber > secondNumber) {  //The error is pointing to this line for some reason, that I can't figure out.
			while (element >= 0) {
				secondTemporary = secondNumber.digitArray[element]-'0';
				firstTemporary = firstNumber.digitArray[element]-'0';

				result = firstTemporary - secondTemporary + copy;
				if (result < 0) {
					result += 10;
					copy = -1;
				}	// end if statement
				else {
					copy = 0;
				}	// end else statement

				final.digitArray[element] = result + '0';
				element--;
			}	// end while statement
			if (copy < 0) {	// to catch an underflow 
				for (int element = 0; element < 40; element++) {
					digitArray[element] = '0';
					digitArray[40] = '\0';
				}	// end for loop
				final.error = true;
			}	// end if statement
		}	// end if statement
		else {
			final.error = true;
		}	// end else statement
	}	// end if statement
	else {
		final.error = true;
	}	// end else statement
	return final;
}	// end function subtract


int main() {
	HugeInteger firstNumber;
	HugeInteger secondNumber;
	HugeInteger answer;

	cout << "Please enter first huge integer: ";
	firstNumber.input();

	cout << "Please enter second huge integer: ";
	secondNumber.input();

	// repeat input to user, to verify
	cout << "The first number you entered was: ";
	firstNumber.output();
	cout << endl;

	cout << "The second number you entered was: ";
	secondNumber.output();
	cout << endl;

	// add integers
	cout << "The addition of the two integers are: ";
	answer.add(firstNumber, secondNumber).output();
	cout << endl;

	// subtract integers
	cout << "The subtraction of the two integers are: ";
	answer.subtract(firstNumber, secondNumber).output();
	cout << endl;



	system("PAUSE");
	return 0;
}


This post has been edited by drmsndrgns: 20 April 2008 - 07:48 PM


Is This A Good Question/Topic? 0
  • +

Replies To: HugeInteger Class Subtraction error

#2 Martyr2   User is offline

  • Programming Theoretician
  • member icon

Reputation: 5612
  • View blog
  • Posts: 14,686
  • Joined: 18-April 07

Re: HugeInteger Class Subtraction error

Posted 20 April 2008 - 08:05 PM

Well remember, the compiler doesn't yet know how to compare your custom object. How does it know if firstNumber (which is of type HugeInteger) is bigger, smaller, or equal to another HugeInteger?

So when it encounters the line it goes to your HugeInteger class and attempts to find an overloaded operator of type ">" to find out how to compare your two classes to one another. Well, you haven't defined this relationship.

Now I am assuming you haven't yet learned about overloading operators which is why your instructions were to use predicates like isGreaterThan() to compare objects. So the line should be something like...

if (firstNumber.isGreaterThan(secondNumber)) {
     // Do the rest of the stuff
}



I also want to point out that when you do a method like "subtract()" perhaps you should be accepting one parameter... the other HugeInteger. You are then to take the current variables of this class and subtract items of the passed in parameter. So you might want to look into that as well.

I hope that points you in the right direction now. Enjoy!

"At DIC we be huge number dealing code ninjas... we deal with huge integers, and huge... ahem... other things." :snap:

This post has been edited by Martyr2: 20 April 2008 - 08:08 PM

Was This Post Helpful? 0
  • +
  • -

#3 drmsndrgns   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 8
  • Joined: 10-March 08

Re: HugeInteger Class Subtraction error

Posted 21 April 2008 - 05:31 AM

Ahhhh, well that makes a whole lot more sense, I thank you very much. We have actually learned about the overloading operators, those will not come into play on this particular assignment but the next one. Thank you so much!

This post has been edited by drmsndrgns: 21 April 2008 - 05:48 AM

Was This Post Helpful? 0
  • +
  • -

#4 drmsndrgns   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 8
  • Joined: 10-March 08

Re: HugeInteger Class Subtraction error

Posted 21 April 2008 - 06:18 PM

Ok, here I am with some more problems, I have the adding and subtraction working and I have the code for the multiplying, but it has something wrong with it as I can't pinpoint the problem, all I get is zero's to match the result. No errors or faults are showing up. Also, for some reason in the dos window I see the following when I enter:

Please enter first huge integer: 643
Please enter second huge integer: 312

The first number you entered was: 643
The second number you entered was: 312

The addition of the two integers are: 955
The subtraction of the two integers are: 331
The multiplication of the two integers are: 00
First number entered is equal to second number entered.
First number entered is less than the second number entered.
First number entered is greater than or equal to the second number entered.
Press any key to continue . . .

I am not sure why i am seeing the last three lines instead of :
First number entered is not equal to the second number entered.
First number entered is greater than the second number entered. etc...

I hope that I have been clear about the problems. Here is my code:
#ifndef HUGEINTEGER_H
#define HUGEINTEGER_H

class HugeInteger {
public:
	HugeInteger();	// default constructor

	void input();	// function input
	void output();	// function output
	HugeInteger add (HugeInteger, HugeInteger);	// function add
	HugeInteger subtract (HugeInteger, HugeInteger);	// function subtract
	HugeInteger multiply (HugeInteger, HugeInteger);	// function multiply
	HugeInteger additionalMultiply(HugeInteger, int, int);

	bool isEqualTo(const HugeInteger &);	// predicate function isEqualTo
	bool isNotEqualTo(const HugeInteger &);	// predicate function isNotEqualTo
	bool isGreaterThan (const HugeInteger &);	// predicate function isGreaterThan
	bool isLessThan	(const HugeInteger &);	// predicate function isLessThan
	bool isGreaterThanOrEqualTo (const HugeInteger &);	// predicate function isGreaterThanOrEqualTo
	bool isLessThanOrEqualTo (const HugeInteger &);	// predicate function isLessThanOrEqualTo
	bool isZero(const HugeInteger &number);

private:
	char digitArray[40];
	int Padding();		// to account for remainder of 40 digits that have no number with a 0
	bool error;
};	// end class HugeInteger_H

#endif


#include <iostream>
#include <cstring>
#include <cstdlib>
#include "HugeInteger.h"

   using namespace std;

	HugeInteger::HugeInteger() {
	  for (int element = 0; element < 40; element++) {
		 digitArray[element] = '0';
		 digitArray[40] = '\0';
	  }	// end for loop
	  error = false;
   }	// end constructor HugeInteger

	int HugeInteger::Padding() {	// to cover for the remainder of the array
	  int element;
	  for (element = 0; element < sizeof digitArray - 2; element++) {
		 if (digitArray[element] == '0') {
		 }	// end if statement
		 else {
			break;
		 }	// end else statement
	  }	// end for loop
	  return element;
   }	// end int Padding

	void HugeInteger::input() {		// read value from user to set HugeInteger
	  char inputString[41];
	  int element = 0;
   
	  cin.getline(inputString, sizeof inputString);
   
	  if (!error) {
		 element = (int) strlen(inputString);
	  
		 while (element >= 0) {
			digitArray[40 - strlen(inputString) + element] = inputString[element];
			element--;
		 }	// end while loop
	  }	// end if statement
   }	// end function input

	void HugeInteger::output() {
	  for (int element = Padding(); element < sizeof digitArray; element++) {
		 cout << digitArray[element];
	  }	// end for loop
   }	// end function output


	 HugeInteger HugeInteger::add (HugeInteger firstNumber, HugeInteger secondNumber)  {
	  int element = 0, carry = 0, firstTemporary = 0, secondTemporary = 0, result = 0, value = 0;
	  HugeInteger final;
   
	  element = sizeof digitArray - 1;
   
	  while (element >= 0) {
		 secondTemporary = secondNumber.digitArray[element]-'0';
		 firstTemporary = firstNumber.digitArray[element]-'0';
		 result = firstTemporary + secondTemporary + carry;
		 carry = result / 10;
		 value = result % 10;
		 final.digitArray[element] = value + '0';
		 element--;
	  }	// end while loop
	  if (carry > 0) {			// to catch an overflow
		 for (int element = 0; element < 40; element++) {
			digitArray[element] = '0';
			digitArray[40] = '\0';
		 }	// end for loop
		 final.error = true;
	  }	// end if statement
	  return final;
   }	// end function add

	HugeInteger HugeInteger::subtract (HugeInteger firstNumber, HugeInteger secondNumber) {
	  int element = 0, firstTemporary = 0, secondTemporary = 0, result = 0, copy = 0;
	  HugeInteger final;

	  element = sizeof digitArray - 1;
 
	  while (element >= 0) {
		 secondTemporary = secondNumber.digitArray[element]-'0';
		 firstTemporary = firstNumber.digitArray[element]-'0';
			
		 result = firstTemporary - secondTemporary + copy;
		 if (result < 0) {
			result += 10;
			copy = -1;
		 }	// end if statement
		 else {
			copy = 0;
		 }	// end else statement
			
		 final.digitArray[element] = result + '0';
		 element--;
	  }	// end while statement
	  if (copy < 0) {			// to catch an underflow
		 for (int element = 0; element < 40; element++) {
			digitArray[element] = '0';
			digitArray[40] = '\0';
		 }	// end for loop
		 final.error = true;
	  }	// end if statement
  
	  return final;
   }	// end function subtract

	HugeInteger HugeInteger::multiply(HugeInteger firstNumber, HugeInteger secondNumber) {
	  int element = 0, digit = 0;
	  HugeInteger final, numbers;
   
	  element = sizeof digitArray - 1;
   
	  while (element >= 0) {
		 digit = secondNumber.digitArray[element]-'0';
		 final = final.additionalMultiply(firstNumber, digit, element);
		 numbers.add(numbers, final);
		 element--;
	  }	// end while statement
   
	  for (int factor = 0; factor < sizeof digitArray - 1; factor++) {
		 digitArray[factor] = numbers.digitArray[factor];
	  }	/// end for loop
	  return numbers;
   }	// end function multiply

	HugeInteger HugeInteger::additionalMultiply(HugeInteger firstNumber, int digit, int position) {
	  int element = 0, firstTemporary = 0, secondTemporary = 0, multipliedResult = 0, value = 0, carry = 0;
	  HugeInteger final;
   
	  element = sizeof digitArray - 1;
   
	  for (int factor = position; factor < 40; factor++) {
		 digit *= 10;
	  }	// end for loop
   
	  while (element >= 0) {
		 secondTemporary = digit;
		 firstTemporary = firstNumber.digitArray[element]-'0';
		 multipliedResult = firstTemporary * secondTemporary + carry;
		 carry = multipliedResult / 10;
		 value = multipliedResult % 10;
		 final.digitArray[element] = value + '0';
		 element--;
	  }	// end while statement
   
	  if (carry > 0) {		// to catch overflow
		 for (int element = 0; element < 40; element++) {
			digitArray[element] = '0';
			digitArray[40] = '\0';
		 }	// end for loop
		 final.error = true;
	  }	// end if statement
	  return final;
   }  // end function additionalMultiply


	bool HugeInteger::isEqualTo(const HugeInteger &number) {
	  for (int element = 0; element < sizeof digitArray; element++) 
		 if (digitArray[element] = number.digitArray[element]) 
			return true;
		 else 
			return false;
   }	// end function isEqualTo

	bool HugeInteger::isNotEqualTo(const HugeInteger &number) {
	  if (!isEqualTo(number)) 
		 return true;
	  else 
		 return false;
   }	// end function isNotEqualTo

	bool HugeInteger::isGreaterThan(const HugeInteger &number) {
	  for (int element = 0; element < sizeof digitArray; element++) 
		 if (digitArray[element] > number.digitArray[element]) 
			return true;
		 else 
			return false;
   }	// end function isGreaterThan

	bool HugeInteger::isLessThan(const HugeInteger &number) {
	  if (!isGreaterThan(number))
		 return true;
	  else 
		  return false;
   }	// end function isLessThan

	bool HugeInteger::isGreaterThanOrEqualTo(const HugeInteger &number) {
		for (int element = 0; element < sizeof digitArray; element++) 
			if (digitArray[element] >= number.digitArray[element]) 
				return true;
			else 
				return false;
	}	// end function isGreaterThanOrEqualTo

	bool HugeInteger::isLessThanOrEqualTo(const HugeInteger &number) {
		if (!isGreaterThanOrEqualTo(number))
			return true;
		else 
			return false;
	}	// end function isLessThanOrEqualTo


	int main() {
	  HugeInteger firstNumber;
	  HugeInteger secondNumber;
	  HugeInteger result;
   
	  cout << "Please enter first huge integer: ";
	  firstNumber.input();
   
	  cout << "Please enter second huge integer: ";
	  secondNumber.input();
   
   // repeat input to user, to verify
	  cout << "\nThe first number you entered was: ";
	  firstNumber.output();
	  cout << endl;
   
	  cout << "The second number you entered was: ";
	  secondNumber.output();
	  cout << endl;
   
   // add integers
	  cout << "\nThe addition of the two integers are: ";
	  result.add(firstNumber, secondNumber).output();
	  cout << endl;
   
   // subtract integers
	  cout << "The subtraction of the two integers are: ";
	  result.subtract(firstNumber, secondNumber).output();
	  cout << endl;
   
   // multiply integers
	  cout << "The multiplication of the two integers are: ";
	  result.multiply(firstNumber, secondNumber).output();
	  cout << endl;

	// isEqualTo 
	  if (firstNumber.isEqualTo(secondNumber)) 
		  cout << "First number entered is equal to second number entered." << endl;
	
	// isNotEqualTo
	  if (firstNumber.isNotEqualTo(secondNumber)) 		
		cout <<"First number entered is not equal to second number entered." << endl;

	// isGreaterThan
	  if (firstNumber.isGreaterThan(secondNumber)) 		
		cout << "First number entered is greater than the second number entered." << endl;

	// isLessThan
	  if (firstNumber.isLessThan(secondNumber)) 
		  cout << "First number entered is less than the second number entered." << endl;

	// isGreaterThanOrEqualTo
	  if (firstNumber.isGreaterThanOrEqualTo(secondNumber)) 
		  cout << "First number entered is greater than or equal to the second number entered." << endl;

	// isLessThanOrEqualTo
	  if (firstNumber.isLessThanOrEqualTo(secondNumber)) 
		  cout << "First number enteres is less than or equal to the second number entered." << endl;
  
	  system("PAUSE");

	  return 0;
   }	// end method main



Martyr2 also stated to switch the the methods like add() and subtract() and probably the multiply to accept one parameter only, I have tried to do this, but I haven't done so successfully, would anyone be able to point me in the right direction?

This post has been edited by drmsndrgns: 21 April 2008 - 07:06 PM

Was This Post Helpful? 0
  • +
  • -

#5 Martyr2   User is offline

  • Programming Theoretician
  • member icon

Reputation: 5612
  • View blog
  • Posts: 14,686
  • Joined: 18-April 07

Re: HugeInteger Class Subtraction error

Posted 23 April 2008 - 03:31 PM

Well first we should fix the isEqualTo and see if that has something to do with the isLessThan firing because the bug in isEqualTo is going to cause problems...

    bool HugeInteger::isEqualTo(const HugeInteger &number) {
      for (int element = 0; element < sizeof digitArray; element++)
         if (digitArray[element] = number.digitArray[element])
            return true;
         else
            return false;
   }    // end function isEqualTo



Notice that you have digitArray[element] = number.digitArray[element] it should be double equals, not single equals. otherwise you are going to take the number passed to isEqualTo, copy the first element over no matter what it is and return true.

This might be causing problem in the isLessThan because now the two elements are identical so in the isGreaterThan you compare the first to elements, they are equal, the if fails and returns false back to isLessThan which returns true and prints the message that element one is less than the second number.

So fix that error and see if both lines correct themselves.

As for what I was talking about before with the one parameter, you would set them up just like the isEqualTo or isLessThan... one parameter passed in, its digits are then added to the digit array of the current HugeInteger instance to produce a new array which you can then return from the function thus to be assigned to a waiting result array. Just like you would do when overloading the operator + or - through operator overloading procedures.

:)

This post has been edited by Martyr2: 23 April 2008 - 03:35 PM

Was This Post Helpful? 0
  • +
  • -

#6 drmsndrgns   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 8
  • Joined: 10-March 08

Re: HugeInteger Class Subtraction error

Posted 27 April 2008 - 01:20 PM

Thank you Martyr2 for your help and assistance, I have been able to complete this, hopefully I will be able to get all the overloaded functions figured out...
Was This Post Helpful? 0
  • +
  • -

#7 Martyr2   User is offline

  • Programming Theoretician
  • member icon

Reputation: 5612
  • View blog
  • Posts: 14,686
  • Joined: 18-April 07

Re: HugeInteger Class Subtraction error

Posted 27 April 2008 - 01:26 PM

You are welcome. Glad we could be of assistance and good luck with the other operators and your project in general. :)
Was This Post Helpful? 0
  • +
  • -

#8 123a   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 1
  • Joined: 27-March 09

Re: HugeInteger Class Subtraction error

Posted 27 March 2009 - 04:12 PM

View PostMartyr2, on 27 Apr, 2008 - 12:26 PM, said:

You are welcome. Glad we could be of assistance and good luck with the other operators and your project in general. :)

helle All
Im sorry but anybody has all solution of huge integer problem ?
Was This Post Helpful? 0
  • +
  • -

#9 Guest_Petr_Kropotkin*


Reputation:

Re: HugeInteger Class Subtraction error

Posted 20 March 2010 - 07:53 AM

View Post123a, on 27 March 2009 - 03:12 PM, said:

View PostMartyr2, on 27 Apr, 2008 - 12:26 PM, said:

You are welcome. Glad we could be of assistance and good luck with the other operators and your project in general. :)

helle All
Im sorry but anybody has all solution of huge integer problem ?

Nope but yours is very helpful. I am doing this for fun. I am teaching myself using
Learning C++ 4ed

I am having some problems with my code.
Was This Post Helpful? 0

Page 1 of 1