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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2012, 23:05   #1
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию найти наибольшее число, длинночисленная арифметика, с++

есть массив строк (string) одинаковой длины. Как быстро определить число в какой строке наибольшее. Например допустим есть 3 строки

string row [1] = "1111111";
string row [2] = "1111113";
string row [3] = "1111112";

в данном случае самой крупной является строка под номером 2.

если кто-то такое делал, или четко представляет как это сделать напишите мне пожалуйста а то сил думать уже нет
rUs_LAN вне форума Ответить с цитированием
Старый 22.06.2012, 23:26   #2
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Для начала переводим число из типа строка в целочисленный тип, для этого обычно есть в языке стандартные ф-ции и процедуры. После осуществляем поиск максимального
Код:
k=0;
MaxEl=A[0];
for(int i=0;i<n;i++) 
  {
    if MaxEl<=A[i] 
      {
          MaxEl=a[i];
          k=i;         
       }
     }
   k++;
  printf("Максимальный эл-т:", MaxEl,"Номер максимального эл-та: ", k);
<----Весы Там.

Последний раз редактировалось Npwas; 22.06.2012 в 23:30.
Npwas вне форума Ответить с цитированием
Старый 22.06.2012, 23:42   #3
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

ну и да, но там числа длиииииииииииинные типо таких

12312312847239847923847982374928379 58729387498239482934

их трудно перевести я пробовал
rUs_LAN вне форума Ответить с цитированием
Старый 22.06.2012, 23:50   #4
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от rUs_LAN Посмотреть сообщение
ну и да, но там числа длиииииииииииинные типо таких

12312312847239847923847982374928379 58729387498239482934

их трудно перевести я пробовал
Стркои походу в отличии от чисел подругому сравниваются?! Если да, то попробуй реализовать следующий алгротим:

Тогда сперва сравнивай строки по кол-ву символов, после оставляй строки с наибольшим одинаковым кол-вом символов, и сравнивай их разбивая на одинаковые куски, которые уже будешь спокойно переводить в целочисленный тип.
<----Весы Там.
Npwas вне форума Ответить с цитированием
Старый 22.06.2012, 23:52   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

1. отбрасываем ведущие нули
2. сортируем по длине
3. самая длинная строка == самое большое число
4. если таких строк несколько, просматриваем слева направо, в какой строке в текущей позиции цифра больше, там и большее число
5. если таких строк несколько, продолжаем просматривать, сдвигаясь слева направо
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.06.2012, 23:58   #6
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

О я придумал я сделаю qsort и просто перепишу компарер как мне нужно, а потом возьму первое значение. С этим мороки наверное будет не сильно много. Тем не менее спасибо что помогал

add я понимаю как это сделать с 2мя числами я просто не понимал как это сделать с N числами.

спасибо всем!

нет, к сожалению еще не все, кто шарит в микробенчмарках помогите оптимизировать код.

Суть такова вводятся числа найти максимальное, у меня не компюторе работает достаточно быстро но на тестовом возникает tle (Time limit exceeded)

вот код

Код:
#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;

	int count;

	
	while(!in.eof()) 
	{
		string tmp;
		in >> tmp;
		data.push_back(tmp);
	}

	

	count = data.size();

	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();
		}

	}

	//for(vector<string>::iterator iter = result.begin(); iter != result.end(); ++iter) cout <<*iter << " ";

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

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

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


	system("pause");

	return 0;

}
ну и я себе циферок нагенерировал, можно протестировать на них.

бред я тут мучаюсь 100 000 000 символов 1 000 строк, уже думал профайлеры какие-то подключать, только потом в комментах к задаче прочитал что надо обработать только первые 3 числа, остальные можно игнорировать ...
Вложения
Тип файла: txt INPUT.txt (995.2 Кб, 118 просмотров)

Последний раз редактировалось Stilet; 23.06.2012 в 07:55.
rUs_LAN вне форума Ответить с цитированием
Старый 23.06.2012, 03:44   #7
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от rUs_LAN Посмотреть сообщение
бред я тут мучаюсь 100 000 000 символов 1 000 строк, уже думал профайлеры какие-то подключать, только потом в комментах к задаче прочитал что надо обработать только первые 3 числа, остальные можно игнорировать ...
Иногда инстинктивно делаешь больше чем требуют. Препод бы офигел наверное увидев бы прогу, которая обрабатывает такой объем информации.
<----Весы Там.
Npwas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти наибольшее число. Массив байт. (assembler) Wasisualy Помощь студентам 1 27.12.2011 13:48
В процессоре KP580BM80A найти наибольшее число таня1 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.12.2011 21:04
В процессоре KP580BM80A найти наибольшее число таня1 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.11.2011 10:32
Программа с использование массива найти 3-е наибольшее число Tатьяна Помощь студентам 7 01.11.2010 09:23
Найти на отрезке [n, 2n] натуральное число, имеющее наибольшее количество делителей. APTEMUC Паскаль, Turbo Pascal, PascalABC.NET 2 10.12.2008 05:20