
LongNumber
LongNumber::operator<< (int n)
{
LongNumber temp = *this;
setLength(length_ + n);
for (int i = 0; i < temp.length_; i++)
array_[i + n] = temp.array_[i];
return *this;
}
// Функция устанавливает новую длину массива числа
// создает новый массив заданной длины и инициализирует его нулями.
void
LongNumber::setLength (int length)
{
delete [] array_;
if (length == 0)
length++;
array_ = new int[length];
for (int i = 0; i < length; i++)
array_[i] = 0;
length_ = length;
}
Остаток от деления: код функции аналогичен коду фукции деления, за тем исключением, что сразу после окончания внешнего цикла while возвращается dividend.
Сценарий диалога
Программа последовательно запрашивает два числа, а затем выводит результаты тех операций с длинными числами, которые реализованы в классе LongNumber.
Enter first long number : 9876543210
Enter second long number: 1234567890
a = 9876543210
b = 1234567890
a - b = 8641975320
a + b = 11111111100
a * b = 12193263111263526900
a / b = 8
a % b = 90
a > b = 1
a < b = 0
a >= b = 1
a <= b = 0
a == b = 0
Приложение 1
Заголовочный файл LongNumber.hpp
#ifndef LONG_NUMBER_H
#define LONG_NUMBER_H
#include <iostream>
class LongNumber
{
public:
/**
* Default constructor. Initialize object by one zero array element.
* Sets length_ and sign_ fields to 1.
*/
LongNumber();
/**
* Constructor based on char sequence. Char sequence must consist only
* digits and can start by minus character. Also it must present
* number in normal view. For example string -000000000000 is not
* good idea. Instead this, it must be only zero (0) or at least
* minus zero (-0), which will be converted in zero.
* @param string zero-terminated sequence of char
*/
LongNumber(const char* string);
/**
* Constructor based on other LongNumber object.
* @param number another LongNumber object
*/
LongNumber(const LongNumber& number);
/**
* Constructor based on int.
* @param number
*/
LongNumber(int number);
/**
* Destructor.
*/
~LongNumber();
// ====================================================================
//
// Operators
//
// ====================================================================
LongNumber operator= (const LongNumber& number);
LongNumber operator+ (const LongNumber& number);
LongNumber operator- (const LongNumber& number);
LongNumber operator* (const LongNumber& number);
LongNumber operator* (int number);
LongNumber operator/ (const LongNumber& number);
LongNumber operator% (const LongNumber& number);
LongNumber operator>> (int n);
LongNumber operator<< (int n);
bool operator> (const LongNumber& number);
bool operator>= (const LongNumber& number);
bool operator< (const LongNumber& number);
bool operator<= (const LongNumber& number);
bool operator== (const LongNumber& number);
// Дружественная функция не являющаяся элементом какого-либо класса.
// Т.е. фактически вызов: cout << someLongNum
// заменяется компилятором на вызов функции: operator<<(cout, someLongNum)
// которая, в свою очередь, возвращает ссылку на объект ostream,
// что позволяет писать выражения подобные: cout << someLongNum << "Hello, world!";
// Спецификатор friend позволяет функции получать доступ к приватным
// свойствам и методам класса LongNumber.
friend std::ostream & operator<< (std::ostream& os, const LongNumber& number);
// ====================================================================
//
// Constants
//
// ====================================================================
const static int BASE;
const static int NUMERALS_IN_DIGIT;
private:
// ====================================================================
//
// Fields
//
// ====================================================================
// Number sign, can be 1 or -1
char sign_;
// Current length of array
int length_;
// Pointer to array
int* array_;
// ====================================================================
//
// Methods
//
// ====================================================================
// Returns the lenght of the zero-terminating string
int stringLength(const char* string);
// Convert string to number
int stringToNumber(const char* string, unsigned int length);
// Raise number to power
int power(int base, int power);
// Compute sum of two LongNumbers
LongNumber sum (const LongNumber& a, const LongNumber& b);
// Compute difference of two LongNumbers
LongNumber difference (const LongNumber& a, const LongNumber& b);
// Compare modules of two LongNumbers and return -1 if first is bigger
// than second, 0 - if they are equals, 1 - if first is less than second.
int compareModules (const LongNumber& a, const LongNumber& b);
// Same as compareModules function but also sensitive to the signs of
// numbers.
int compare (const LongNumber& a, const LongNumber& b);
// Return minimum of two values
int minimum (int a, int b);
// Return maximum of two values
int maximum (int a, int b);
// Delete old array and creates new array of specified length
void setLength (int length);
//Set specified digit.
void setDigit(int digit, int value);
};
#endif /* LONG_NUMBER_H */