Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2014, 21:27   #1
Sonny01
Пользователь
 
Регистрация: 07.11.2009
Сообщений: 49
По умолчанию Длинные числа. Сравнение >, <

Доброго времени суток всем.
помогите пожалуйста прояснить алгоритм сравнения относительно длинных чисел (например 2 в 512 степени) , реализация не проблема.
Вопрос в том, что изначально задача показалась простой, но при более подробном рассмотрении свои подводные камни.
Длинное число представлено в массиве, каждая цифра отдельно.
хочу взять каждую цифру двух массивов в цикле и сравнивать их между собой, к примеру 741 и 128 7 > 1 , 4 > 2, 1 < 8, в итоге имеем: 110 против 001, больше 741, всё понятно, но в случае с 721 и 188 - 100 и 011 , выходит такой подход тут не проходит
Sonny01 вне форума Ответить с цитированием
Старый 15.12.2014, 23:14   #2
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

когда то делал такой класс
Код:
const int size = 29;
//-BEGIN-CLASS----------
class HugeInt{
	friend ostream &operator<< (ostream &, const HugeInt &);
 public:
	HugeInt(int = 0);
	HugeInt(const char*);
	HugeInt operator+ (HugeInt &);
	HugeInt operator+ (int );
	bool operator> (HugeInt &);
	bool operator>= (HugeInt &);
	bool operator< (HugeInt &);
	bool operator<= (HugeInt &);
	bool operator== (HugeInt &);
	bool operator!= (HugeInt &);
 private:
	short integer[(size + 1)];
};

......................................

bool HugeInt::operator> (HugeInt &hi2){
 for (int i = size; i >= 0; i--) {
	 if (integer[i] > hi2.integer[i])
		return true;
	}
 return false;
}
//-------------------------
bool HugeInt::operator< (HugeInt &hi2){
 for (int i = size; i >= 0; i--) {
	 if (integer[i] < hi2.integer[i])
		return true;
	}
 return false;
}
//-------------------------
bool HugeInt::operator== (HugeInt &hi2){
 for (int i = size; i >= 0; i--) {
	 if (integer[i] != hi2.integer[i])
		return false;
	}
 return true;
}
//-------------------------
bool HugeInt::operator!= (HugeInt &hi2){
 if (*this == hi2)
	return false;
 return true;
}
//-------------------------
bool HugeInt::operator>= (HugeInt &hi2){
 if ((*this > hi2) || (*this == hi2))
		return true;
 return false;
}
//-------------------------
bool HugeInt::operator<= (HugeInt &hi2){
 if ((*this < hi2) || (*this == hi2))
		return true;
 return false;
}
если интересно могу выложить класс полностью.
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 15.12.2014, 23:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Длинное число представлено в массиве, каждая цифра отдельно.
для длинного числа обычно хранится его длина (значность). А иначе, откуда Вы узнаете, скольк циферок нужно выводить, да?

Так вот, дальше всё просто, у какого числа число знаков (N) больше, то число и больше.
Если значность одного числа равна значности другого, то начинаем сравнивать ОТ СТАРШИХ разрядов, до тех пор, пока очередной разряд Число1 равен аналогичному разряду Числа2. Если встретили неравные разряды, то у какого числа этот разряд больше, то и то число больше. Если дошли до самого младшего разряда и не нашли отличий, то Число1 равно Числу2.
всё.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинные числа. makaroshka_1 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2013 21:58
Длинные числа alizon09 Фриланс 1 09.02.2013 12:45
Вычесления НОД (длинные числа) n3250sasha C++ Builder 0 21.12.2011 16:39
Деление длинных чисел на длинные числа Dr. Feelgood Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.06.2010 12:05
длинные числа molodzo Общие вопросы C/C++ 4 21.02.2008 12:46