Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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, это не есть гуд))Есть немного другой подход, видимо у аффтора нету опыта по этому поводу,вот и всё))) Иму бы книжечек почитать. |
|
Вернуться к началу |
|
|
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]
Да какой спор что вы просто мне не понятна ваша категоричность, вот и всё.
Мне пофиг во что конвертировать, из целого в строку или в символьный массив, и то и другое вполне осуществимо
Интересно что вы подразумеваете под разницей между 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, в свое удовольствие! Удачи! |
|
Вернуться к началу |
|
|
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". |
|
Вернуться к началу |
|
|
|