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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2012, 15:48   #1
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию Нужно считать и сравнить ну очень большие числа (C++)

Необходимо считать три числа из файла, максимальное значение которых может достигать 10^100, что, по сути, немало. Конечно, можно считать числа в виде строк, посимвольно сравнить их и вывести порядковый номер максимально, но мне необходимо вывести само число, которое является наибольшим из них. При этом, числа могут отличаться одним лишь последним, 10^100-ым символом, что добавляет этой проблеме сложности. Есть ли какие-нибудь советы, как реализовать подобное? Только без векторов и прочего (а то я видел, эту задачу с использованием векторов и прочего хотели решить).
Nomicos вне форума Ответить с цитированием
Старый 11.07.2012, 15:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

про длинную арифметику Вы что-нибудь слышали?

Так вот - описываете три переменные, которые могут вместить данные числа:
это либо строка на 100 символов, либо массив из байт/символов на 100 элементов (либо вектор, динамический массив и вообще всё, что угодно, что может содержать последовательно 100 циферок и обеспечить доступ к любой из этих циферок).
считываете туда выши числа. выравниваете по старшим разрядам. сравниваете (пользуясь знаниями начальной школы). Найденное число выводите. Профит.

p.s. вашего C++ я не знаю, пример написать не могу.
p.p.s. возможно в вашей версии C++ уже есть тип данных BigNumbers - можете воспользваться им..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2012, 16:24   #3
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

Serge_Bliznykov, увы, я только изучаю C++ и про длинную арифметику слышал лишь краем уха. Массив из 100 элементов типа int выглядит достаточно легко, но знаний начальной школы, состоящих из умения запускать Paint и рисовать ровный круг, недостаточно, чтобы я смог выровнять числа по старшим разрядам. Аналогично со сравнением, нет идей по поводу управления и условия остановки цикла посимвольного сравнения.
Nomicos вне форума Ответить с цитированием
Старый 11.07.2012, 16:45   #4
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Чтото не понял в чём проблема... Ответ написан в первом посте... Не?
Работаешь как с строками, сравниваешь для начала их длины. Затем посимвольно с самого начала.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 11.07.2012, 17:43   #5
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

Код:
#include <iostream>
 
using namespace std;

int main() {

	setlocale(0, "RUS");

	char a[102], b[102], c[102];

	char max[102];

	if(strlen(a) != strlen(b) && strlen(b) != strlen(c) && strlen(a) != strlen(c)) {
		if(strlen(a) > strlen(b) && strlen(a) > strlen(c)) strcpy(max, a);
		if(strlen(b) > strlen(a) && strlen(b) > strlen(c)) strcpy(max, b);
		if(strlen(c) > strlen(a) && strlen(c) > strlen(b)) strcpy(max, c); }

	else {
		for(int i = 0; i < 102; i++) {
			if(a[i] == b[i] && b[i] == c[i]) { continue; }
			else {
				if(a[i] > b[i] && a[i] > c[i]) { strcpy(max, a); }
				if(b[i] > a[i] && b[i] > c[i]) { strcpy(max, b); }
				if(c[i] > a[i] && c[i] > b[i]) { strcpy(max, c); }
			}
		}
	}

	printf("%s", max);

	return 0;
}
Выглядит ужасно, но должно работать, тем не менее:
Код:
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
© VC2010.
Nomicos вне форума Ответить с цитированием
Старый 11.07.2012, 19:11   #6
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Действительно выглядит неочень. Я вообще тоже на Си не пишу, покажу как я предполагал на Делфи это делать. Переделать не составит труда.

Код:
Function AorB(A, B : String) : Byte;
// 0 - они равны, 1 - первое больше, 2 - второе больше.
Var k : Integer;
Begin
// Зададим начальное значение.
Result := 0;
// Проверим цифры по длине.
If Length(A) > Length(B) Then Begin Result := 1; Exit; End;
If Length(A) < Length(B) Then Begin Result := 2; Exit; End;
// Сравниваем по элементам.
For k := 1 To Length(A) Do
  Begin
    If StrToInt(A[k]) > StrToInt(B[k]) Then Begin Result := 1; Exit; End;
    If StrToInt(A[k]) < StrToInt(B[k]) Then Begin Result := 2; Exit; End;
  End;
// End
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var s1, s2, s3, max : String;
Begin
// Числа
s1 := '1234567891';
s2 := '1234567894';
s3 := '12345635235';
// Сделаем вид что первое число максимальное и приступим к сравнению.
max := s1;
If AorB(s1, s2) = 2 Then max := s2;
If AorB(max, s3) = 2 Then max := s3;
// Вывод
ShowMessage(max);
// End
End;
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 11.07.2012, 19:36   #7
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

А не проще питон заюзать? Там длинная арифметика по умолчанию.
http://liveworkspace.org/code/0e31fe...61ec172181ba73
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 12.07.2012, 03:20   #8
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

acmp.ru - отсюда ?)

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>


using namespace std;

bool Comparer(string l, string r)
{
	int i = 0;

	while(l[i] != '\0')
	{
		if(l[i] > r[i]) return true;
		if(l[i] < r[i]) return false;
		i++;
	}
}

int main()
{

	ifstream in("INPUT.txt");
	ofstream out("OUTPUT.txt");


	vector<string> data(3);

	string eee;

	for(int i = 0; i < 3; i++) 
	{
		in >> eee;
		data.push_back(eee);
	}

	vector<string>::iterator first = data.begin();

	vector<string> result;

	string tmp = *first;
	int max = tmp.length();

	for(vector<string>::iterator iter = first + 1; iter != data.end(); ++iter) 
	{
		tmp = *iter;
		if(tmp.length() == max) result.push_back(tmp);

		if(tmp.length() > max) 
		{
			result.clear();
			result.push_back(tmp);
			max = tmp.length();
		}

	}

	cout << result.size();
	if(result.size() == 1)
	{
		out << result.front();
		return 0;
	}

	sort(result.begin(), result.end(), Comparer);

	out << result.front() << endl;





	
	

	




	system("pause");

	return 0;

}
rUs_LAN вне форума Ответить с цитированием
Старый 12.07.2012, 11:21   #9
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

rUs_LAN, именно оттуда и именно это решение меня, человека, не знающего векторы и их функции, меня пугает.
Nomicos вне форума Ответить с цитированием
Старый 12.07.2012, 11:52   #10
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

Ладно, я переделал код...

Код:
#include <iostream>
#include <cstring>
 
using namespace std;

int main() {

	setlocale(0, "RUS");

	char a[102], b[102], c[102], max[102];

	scanf("%s %s %s", &a, &b, &c);

	int la = strlen(a); int lb = strlen(b); int lc = strlen(c);

	// Строка для дебаггинга, отображает введённые числа и их длины.
	printf("a = %s, b = %s, c = %s\nla = %d, lb = %d, lc = %d", a, b, c, la, lb, lc);

	// В случае, если одна из строк длиннее остальных
	if( (la != lc && la != lb) || (lb != la && lb != lc) || (lc != la && lc != lb) ) {
		if( la > lb && la > lc ) { strcpy(max, a); }
		if( lb > la && lb > lc ) { strcpy(max, b); }
		if( lc > la && lc > lb ) { strcpy(max, c); } } else {

	// В ином случае, сравниваем посимвольно
		for(int i = 0; ; i++) {
			if(a[i] > b[i] && a[i] > c[i]) { strcpy(max, a); break; }
			if(b[i] > a[i] && b[i] > c[i]) { strcpy(max, b); break; }
			if(c[i] > a[i] && c[i] > b[i]) { strcpy(max, c); break; } } }

	printf("\n%s", max);

	return 0;
}
Всё работает прекрасно, кроме случая, когда максимальное число повторяется два раза. В таком случае, оно выводит дофига символов "М" и в конце оставшееся, меньшее, число.

Последний раз редактировалось Nomicos; 12.07.2012 в 12:07.
Nomicos вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Большие числа GroZa Общие вопросы C/C++ 5 14.06.2012 19:24
Очень очень большие числа. Mr_freeman Помощь студентам 5 03.05.2012 16:49
большие числа NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 37 20.07.2011 16:26
Большие числа DRAgon™ Общие вопросы по Java, Java SE, Kotlin 12 29.01.2011 02:53
Большие числа Лубышев Помощь студентам 6 27.02.2008 22:57