Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Плиз хелп, задача С++

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Vladigor



Зарегистрирован: 17.03.2007
Сообщения: 3
Откуда: Смоленск

СообщениеДобавлено: Сб Мар 17 2007 23:30    Заголовок сообщения: Плиз хелп, задача С++ Ответить с цитатой

для целочисленного одномерного массива из n элементов(1<n<100) выполнить: найти все числа палиндромы среди элементов массива. Заранее Благодарен.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Device



Зарегистрирован: 15.03.2007
Сообщения: 3

СообщениеДобавлено: Пн Мар 19 2007 11:29    Заголовок сообщения: Ответить с цитатой

В принципе, найти что-либо в одномерном массиве проблемы не составляет, но что такое палиндромы?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vladigor



Зарегистрирован: 17.03.2007
Сообщения: 3
Откуда: Смоленск

СообщениеДобавлено: Пн Мар 19 2007 15:59    Заголовок сообщения: Ответить с цитатой

Device писал(а):
В принципе, найти что-либо в одномерном массиве проблемы не составляет, но что такое палиндромы?

Палиндромы- числа перевертыши например 121 или 2345432 и т.д
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Пн Мар 19 2007 19:09    Заголовок сообщения: Ответить с цитатой

Палиндромы - это такие слова и фразы, которые читаются одинаково, как слева направо, так и справа налево.

Т.е. все элементарно. Берем одно число из массива. Делаем из него строку.
Начинаем сравнивать строку с начала и конца двигаясь к середине. Проверяем до середины строки. Если сравнение удачное, все совпало, то это палиндром. Если первая же ошибка в сравнении, то это не палиндром и переходим к другому числу массива.

Задача плевая. Думать даже негде.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vladigor



Зарегистрирован: 17.03.2007
Сообщения: 3
Откуда: Смоленск

СообщениеДобавлено: Вт Мар 20 2007 22:02    Заголовок сообщения: Ответить с цитатой

and3008 писал(а):
Палиндромы - это такие слова и фразы, которые читаются одинаково, как слева направо, так и справа налево.

Т.е. все элементарно. Берем одно число из массива. Делаем из него строку.
Начинаем сравнивать строку с начала и конца двигаясь к середине. Проверяем до середины строки. Если сравнение удачное, все совпало, то это палиндром. Если первая же ошибка в сравнении, то это не палиндром и переходим к другому числу массива.

Задача плевая. Думать даже негде.


Алгоритм понятен, только без перевода в строку, а работая с каждой цифрой в отдельности во встречных направлениях до конца(что бы не искать середину числа из 3х цифр пример 121), но как реализовать вот в чем вопрос, так как в почти рабочем варианте возникают ошибки, в связи с нехваткой опыта.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Jail



Зарегистрирован: 16.01.2007
Сообщения: 180
Откуда: Russia

СообщениеДобавлено: Вс Мар 25 2007 20:30    Заголовок сообщения: Ответить с цитатой

Сначала определись, что для тебя полиндромы,два числа перевёртыша или что-то ещё?! А потом постараюсь тебе помочь, набросаю программку, ничего сложного. И разъясни какого типа числа используешь, int или unsigned, это очень важно!
Цитата:
Палиндромы - это такие слова и фразы, которые читаются одинаково, как слева направо, так и справа налево.

Причом тут вобще слова и фразы. Это задача алгоритма обрабатываюшего цифры, а не фразы из книги. В программировании нет типов данных такие как "слова" или "фразы".
Есть строковые типы и символьные типы, есть словари в Python.
Цитата:
Т.е. все элементарно. Берем одно число из массива. Делаем из него строку.

И как вы это себе представляете???? из типа int в string?! У этих типов нет ничего общего, это неправильный подход. Даже если преобразовать в char, то это будет код данного символа в таблице ASCII, сравнение тут никчему не приведёт.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Пн Мар 26 2007 00:22    Заголовок сообщения: Ответить с цитатой

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


А какой тут опыт нужен? Элементарная логика и сообразительность.

Хотите секса с числами? Их есть у меня.

Вам надо разбирать каждое число на запчасти методом деления на 10/100/1000/10000 и вычитаниями.

В общем этот путь весьма не эффективный. Идите по нему дальше сами, если хотите.
Проблема заключается в том, что полиндромы для чисел обретают смысл, если вы на них смотрите как на символы. Если вы будете смотреть на них как на числа, я не знаю единого математического правила как определить полиндром это или нет.

Для осознания нарисуйте числовую ось, отложите на ней несколько палиндромов, и подумайте как вы это все ковырять будете. Желание отпадет довольно быстро...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Jail



Зарегистрирован: 16.01.2007
Сообщения: 180
Откуда: Russia

СообщениеДобавлено: Пн Мар 26 2007 06:54    Заголовок сообщения: Ответить с цитатой

Цитата:
В общем этот путь весьма не эффективный. Идите по нему дальше сами, если хотите.
Проблема заключается в том, что полиндромы для чисел обретают смысл, если вы на них смотрите как на символы. Если вы будете смотреть на них как на числа, я не знаю единого математического правила как определить полиндром это или нет.

Вот она истина!!!! Имхо! Но всё же скажу Вам, преобразование из типа int в тип string, это не есть гуд))Есть немного другой подход, видимо у аффтора нету опыта по этому поводу,вот и всё))) Иму бы книжечек почитать. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
adept



Зарегистрирован: 12.02.2007
Сообщения: 31

СообщениеДобавлено: Пт Мар 30 2007 22:34    Заголовок сообщения: Ответить с цитатой

Jail писал(а):
преобразование из типа int в тип string, это не есть гуд))


и чем же такая конвертация не по душе?!?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Jail



Зарегистрирован: 16.01.2007
Сообщения: 180
Откуда: Russia

СообщениеДобавлено: Сб Мар 31 2007 10:47    Заголовок сообщения: Ответить с цитатой

Цитата:
и чем же такая конвертация не по душе?!?

Эти типы не имеют ничего общего. Преобразование из типа int в char возможна, но string это совсем другая тема. Это вопрос из того же рода, что и соображение будто в С++ объединения это зло. Не встречались с этим разве?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
adept



Зарегистрирован: 12.02.2007
Сообщения: 31

СообщениеДобавлено: Сб Мар 31 2007 17:03    Заголовок сообщения: Ответить с цитатой

Jail писал(а):
Цитата:
и чем же такая конвертация не по душе?!?

Эти типы не имеют ничего общего. Преобразование из типа int в char возможна, но string это совсем другая тема. Это вопрос из того же рода, что и соображение будто в С++ объединения это зло. Не встречались с этим разве?


помоему вполне нормальная конвертация, полезная очень
было число 12345 конвертировали получили строку "12345"
что тут може тсмущать не ясно

и в каком смысле "не имеют ничего общего"?
без обид, просто пытаюсь понять
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Jail



Зарегистрирован: 16.01.2007
Сообщения: 180
Откуда: Russia

СообщениеДобавлено: Вс Апр 01 2007 21:39    Заголовок сообщения: Ответить с цитатой

Цитата:
и в каком смысле "не имеют ничего общего"?
без обид, просто пытаюсь понять

Тип int -цисленный, а string-строковый. Есть разница?
Если использовать не именно тип string, а символьный массив, то разложение и преобразование возможно. Хотя представление строк и является символьным массивом, но тип string используется именно как отдельный тип в данном случае. И вобще, спор не к месту.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
adept



Зарегистрирован: 12.02.2007
Сообщения: 31

СообщениеДобавлено: Пн Апр 02 2007 02:21    Заголовок сообщения: Ответить с цитатой

Тип int -цисленный, а string-строковый. Есть разница?
Если использовать не именно тип string, а символьный массив, то разложение и преобразование возможно. Хотя представление строк и является символьным массивом, но тип string используется именно как отдельный тип в данном случае. И вобще, спор не к месту.[/quote]

Да какой спор что вы Smile просто мне не понятна ваша категоричность, вот и всё.
Мне пофиг во что конвертировать, из целого в строку или в символьный массив, и то и другое вполне осуществимо

Интересно что вы подразумеваете под разницей между string и int?
ну да, типы разные, но конвертируется же без проблем!!?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ramiz



Зарегистрирован: 13.04.2007
Сообщения: 6

СообщениеДобавлено: Пт Апр 13 2007 21:37    Заголовок сообщения: Ответить с цитатой

У чисел-палиндромов, если не ошибаюсь, есть какие-то свойства.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
TomSoyer



Зарегистрирован: 16.04.2007
Сообщения: 4

СообщениеДобавлено: Пн Апр 16 2007 11:12    Заголовок сообщения: Ответить с цитатой

Да... господа программеры. Человек просит помочь, а вы демогогии разводите. Постараюсь помочь. Правда давно не писал на классике, поэтому привожу пример в Visual C++. Надеюсь разберёшся.
Суть сей басни такова:
- создаём диалоговый проект в Visual C++
- помещаем 2 LISTBOX-a и присваиваем 2 переменным значения
связанные с этими BOX-ами
m_mass - исходные
m_out - результирующие
- Перехватываем управление кнопочкой ОК и прописываем там
Fill();
Verify();
- Выход естественно по CANCEL
- результат налицо

Код:

void CMyProgDlg::Fill() // Заполняем массив случайными числами
{   int i;
   CString s;
   m_mass.ResetContent();
   for (i=0; i<101; i++)
   { mass[i]=rand();
     s.Format("%d", mass[i]);
     m_mass.AddString(s);
   }
   UpdateData(FALSE);
}

void CMyProgDlg::Verify(void)   // Проверяем массив
{ CString s;
  int i, j, k;

 m_out.ResetContent();            // Удаляем из списка всё что в нём находится
 for (i=1; i<100; i++)            // Перебираем все элементы массива
 { s.Format("%d", mass[i]);         // Это Строковое представление числа
   k=1;                // Считаем что число изначально палиндром
   for (j=0; j<s.GetLength() / 2; j++)       // Проверяем
      if (s.GetAt(j) != s.GetAt(s.GetLength()-j-1)) k=0;   // Не!!! Не АЙС!
   if (k) m_out.AddString(s);          // Заносим в ответ
 }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Апр 17 2007 08:50    Заголовок сообщения: джейл ушёл в программирование и не вернулся Ответить с цитатой

ну джейл и загнул! я видел ересь от программистов, но такую ересь ещё -- нет. это не просто ересь, а святейшая программисткая ересь. он настолько глубоко типизирован, что любая конвертация типов для него есть богохульство и святотатство.

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

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

товарищ джейл, не надо крайностей! будьте проще -- и люди к вам потянутся!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Апр 23 2007 07:03    Заголовок сообщения: Ответить с цитатой

А чего тут такого сложного?
Код:

// Переворачиваем строку Value:
AnsiString ReverseString(const AnsiString Value) {
  AnsiString s; // Сюда пишем результат.
  for (int i = Value.Length(); i > 0; i--) s += Value[i];
  return s;}

// Value - палиндром?
bool IsPalindrome(const int Value) {
  const AnsiString s = Value; // Переводим Value  в строку.
  return s == ReverseString(s);}

И теперь циклом пробегаемся по каждому элементу массива:
Код:

for (int i = 0; i < 100; i++) {
  if (IsPalindrome(Array[i])) /* Array[i] - палиндром */;
  else /* Array[i] - не палиндром */;}

Единственный минус в том, что приведение числа к AnsiString, возможно, занимает больше времени, чем нахождение палиндрома какой-нить арифметической формулой. Но я такой не знаю (хотя есть в голове вариант поразрядной проверки), поэтому сам воспользовался бы именно вышеприведенным способом.


Последний раз редактировалось: Mytilus Galloprovincialis (Пн Апр 23 2007 07:26), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Апр 23 2007 07:22    Заголовок сообщения: Ответить с цитатой

Я писал(а):
Единственный минус в том, что приведение числа к AnsiString, возможно, занимает больше времени, чем нахождение палиндрома какой-нить арифметической формулой.


Это я, конечно, наврал. Не было желания включать мозг, чтоб убедиться в своем высказывании. Но через некоторое время мне все же пришлось его включить, и я решил заодно проверить верность моего предположения. Естественно, приведение числа к строке написано на ассемблере (куда уж быстрее!). Но тем не менее, вопрос остается, потому что надо не только произвести приведение, но и перевернуть и сравнить. Хотя... тоже ерундовое дело. Да и елементов не больше ста...
Так что пользуйтесь, Vladigor, в свое удовольствие! Удачи! Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Апр 23 2007 10:10    Заголовок сообщения: Ответить с цитатой

Хе-хе! И снова я.
Нашел я тут способ нахождения этих пресловутых палиндромов гораздо проще и без приведения типов.
Код:

int a1 = 12345, a2 = 0;
// a1 - число, которое мы проверяем. a2 - число "наоборот".
int i = 1; // Переменная i понадобится в цикле.
while (i <= a1) {
  a2 = ((a2 * 10) % (i * 10)) / i;
  i *= 10;}

Если вкратце, то мы берем по одной цифре из переменной a1, начиная с низшего разряда, и пихаем его в качестве старшего разряда в a2. Цикл while прерывается, когда все цифры перекинуты из a1 в a2. Остается только проверить, a1 == a2.

В данном случае a1 = 12345. Соответственно, после выполнения цикла a2 = 54321. a1 не равна a2, и значит a1 - не палиндром.

Сам код я не проверял, может, где-нить и ошибся. Но на глаз - так все должно работать. Единственное, что вызывает сомнения, это строка a2 = ((a2 * 10) % (i * 10)) / i. Дело в том, что я не помню, целое или действительное число возвращается при использовании оператора "%". Если действительное, то эту строку необходимо модифицировать: a2 = int((a2 * 10) % (i * 10)) / i".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...