Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение, сверхдлинных чисел 
V
    Опции темы
rash
Дата 3.10.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Требуется сравнить два n-значных числа, где n может быть  от 100 до 1000.
Подскажите, пожалуйста, алгоритм выполнения.
PM MAIL   Вверх
Romikgy
Дата 3.10.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



если числа представлены строкой, тогда 
1. сравнить по длинне строк
2. сравнить по первому символу
3. сравнить по 2 символу
и т.д.

переходы между пунктами если ответ сравнения , равны


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
maxim1000
Дата 3.10.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



самый обычный:
сначала сравниваем старшие разряды
если они разные - они и определяют, какое число больше
если одинаковые - продолжаем со следующими разрядами
если оказались все равны - значит равны...


--------------------
qqq
PM WWW   Вверх
rash
Дата 3.10.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Цитата

если они разные - они и определяют, какое число больше


И этой проверки достаточно, чтобы сказать, что строка string1 больше строки string2
PM MAIL   Вверх
Romikgy
Дата 3.10.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



rash, уточнять надо какое именно сравнения те надо
а вообще может и сказать , все равно имхо везде так делается


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
rash
Дата 3.10.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Цитата

уточнять надо какое именно сравнения те надо



Имеется ввиду сравнение как между 5 и 2, т.е. какое из  представленных длинных чисел больше.

PM MAIL   Вверх
Romikgy
Дата 3.10.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Цитата(rash @  3.10.2006,  21:50 Найти цитируемый пост)
Имеется ввиду сравнение как между 5 и 2, т.е. какое из  представленных длинных чисел больше.

дык можно сравнивать равно или не равно!

че ответ не подошел который дали?
сравнивай поразрядно , от старшего , но больше меньше


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
maxim1000
Дата 3.10.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(rash @  3.10.2006,  21:18 Найти цитируемый пост)
И этой проверки достаточно, чтобы сказать, что строка string1 больше строки string2

но небольшое замечание: я предполагал, что длины обоих чисел одинаковые (т.е. дополнено нулями по необходимости), если разные - то, конечно, надо смотреть на длины чисел (точнее, длины их значащих частей, т.е. игнорируя нули в старших разрядах)


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 4.10.2006, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



можно использовать вероятностный алгоритм


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 4.10.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(esperant0 @  4.10.2006,  05:58 Найти цитируемый пост)
можно использовать вероятностный алгоритм

а поподробнее?
а то интересно...


--------------------
qqq
PM WWW   Вверх
rash
Дата 4.10.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Очень интересно. 
Как с помощью этого алгоритма сравнить, предположим, два 400-разрядных числа.
PM MAIL   Вверх
esperant0
Дата 4.10.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Вероятностный алгоритм:

1) стороны случайно равновероятно выбирают лог(х) битов числа и передают эти биты и их индексы друг-другу если все совпало ответ да, числа идентичны, иначе ответ нет.




--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Silent
Дата 5.10.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



"Вероятностный метод" - а если будут строки "11001..." и 10010..." и выберем n-3-й разряд? Никакого другого способа, кроме лобового использовать нельзя.
Пусть длинное число хранится стандартным способом. Тогда сравнение будет выглядеть так (C++):
bool equal(int[] a, int[] b){
  if (a[0]!=b[0]) return false;
  else {
    int i=a[0];
    while ((i>0)&&(a[i]==b[i])) i--;
    return (i==0);
  }
}

или Pascal:
Function equal(a,b:myar):boolean;
  var i:integer;
  begin
    if a[0]=b[0] then equal:=false
    else begin
      i:=a[0];
      while (i>0)and(a[i]=b[i]) do dec(i);
      equal:=i=0;
    end;
  end;
PM MAIL   Вверх
esperant0
Дата 5.10.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(Silent @ 5.10.2006,  16:11)
"Вероятностный метод" - а если будут строки "11001..." и 10010..." и выберем n-3-й разряд? Никакого другого способа, кроме лобового использовать нельзя.
 

Уточню.


Пусть необходимо ответить на вопрос две строки идентичны или отличаются в более чем х% мест. Тогда можно использовать вер-й алгоритм.

Но это уже из области "property testing".


Вероятностный алгоритм для такой задачи был бы более уместен в модели "communication complexity", когда два человека обладающие строкам и желающие их проверить, разделены гиганстким растоянием и передача инф-ии между ними очень дорогая.


Тогда сущ-ет красивый вер-й алгоритм, позволяющий минимизировать переданную информацию до логарифма от длины строки.
 


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Romikgy
Дата 5.10.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



rash, определись на каком те это языке надо , и какой формат входных и выходных данных и тогда организуем


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
rash
Дата 5.10.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Цитата

rash, определись на каком те это языке надо 


Спасибо за содействие.
Реализацию сравнения пишу на C++. 

Цитата

, и какой формат входных и выходных данных и тогда организуем 


Пользователю предлагается ввести два сверхдлинных числа (длину строки он выбирает сам. Предположим, что строки одинаковые и равны,  пусть, 400 знаков), затем, должен последовать ответ, что-то вроде, "Из введённых чисел, число string1 больше string2". примерно так. Хотя, могут быть варианты.
Функция сравнения может возвращать, скажем, число string (которое больше) и разницу этого сравнения (на сколько больше).

ВВод строки, предполагаю, будет не более 500 символов.
PM MAIL   Вверх
Romikgy
Дата 5.10.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



в строках только целые числа правильно, если да то завтра выложу ф_цию сравнения, если кто быстрее не сделает, 
кса  строки это std::string или char * ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
rash
Дата 8.10.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Совершено верно, строка (std::string) должна быть представлена целыми цифрами, 
Код

std::string digits = "129...478;

Вот, примерно так.
PM MAIL   Вверх
Romikgy
Дата 8.10.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Код

#include <iostream.h>
#include <string.h>
#include <ctype.h >
int cmp_str( string *s1, string *s2,long l)
{
 long i;
 char c1,c2;
 for (i=0;i<l;i++)
 if ((*s1)[i]!=(*s2)[i])
 {
  c1=(*s1)[i];
  c2=(*s2)[i];
  if (
  isdigit(c1)&&
  isdigit(c2)
  )
  {
  c1-='0';
  c2-='0';
  if (c1<c2)
  return -1;
  else
  return 1;
  }
  else
  return 0xff;
 }
 return 0;
}
int dif_cmp_str( string *s1, string *s2,long l1,long l2)
{
  long i;

  for (i=0;i<l1;i++)
  if (!isdigit((*s1)[i])) return 0xff;
  for (i=0;i<l2;i++)
  if (!isdigit((*s2)[i])) return 0xff;

  for (i=0;i<l1;i++)
  if ((*s1)[0]=='0')
   s1->erase(0,1);
   else break;
   for (i=0;i<l2;i++)
  if ((*s2)[0]=='0')
   s2->erase(0,1);
   else break;

   l1=s1->length();
   l2=s2->length();

   if (l1==l2)
   {
   return  cmp_str(s1,s2,l1);
   }
   else
   if (l1>l2) return 1;
  else
  return -1;

 return 0;
}
int compare_long_int(string *s1, string *s2)
{
 long l1,l2;
 int rt;
 l1=s1->length();
 l2=s2->length();
 if (l1==l2)
 rt=cmp_str(s1,s2,l1);
 else
 rt=dif_cmp_str(s1,s2,l1,l2);

return rt;
}
int main(int argc, char* argv[])
{
       string sx1,sx2;
       int cmp=0;
       sx1="20";
       sx2="00009";
       cmp=compare_long_int(&sx1,&sx2);
       cout<<sx1;
       switch (cmp)
       {
        case 0: {cout<<" = ";break;}
        case 1: {cout<<" > ";break;}
        case -1: {cout<<" < ";break;}
        case 0xff: {cout<<" Error ";break;}
       }
       cout<<sx2<<endl;
       system("PAUSE");
        return 0;
}


Это сообщение отредактировал(а) Romikgy - 8.10.2006, 17:49


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
rash
Дата 10.10.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



За код сравнения длинных чисел большое спасибо.

есть только, два вопроса:

Назначение функций
Код

int  erase();


и 
Код

system("PAUSE");


PM MAIL   Вверх
Romikgy
Дата 10.10.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Цитата(rash @  10.10.2006,  22:09 Найти цитируемый пост)
int  erase();

удаляет начиная с позиции , н колво символов (у меня в коде убирает ни чего не значащие нули)

Цитата(rash @  10.10.2006,  22:09 Найти цитируемый пост)
system("PAUSE");

просто просит типа Press any key to continue....
некоторые заменяют getchar(); из библиотеки <conio.h>  (было в падло еще одну библу подключать)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
rash
Дата 12.10.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



Благодарю за помощь в решении этого вопроса.
PM MAIL   Вверх
Diesel Draft
Дата 13.10.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: -1
Всего: 5



rash  откуда тьі?
просто такая задача недавно звучала у нас.


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
rash
Дата 14.10.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



если это так, то я пренебрёг поиском по сайту. Сорри.


Если вас не затруднит, укажите, пожалуйста, путь к этой задаче.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1183 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.