Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка палиндрома 
:(
    Опции темы
mimik
Дата 27.12.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


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

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



Цитата(ArniLand @  27.12.2010,  14:28 Найти цитируемый пост)
Дано пятизначное число и нужно проверить является данное число палиндромом

Код

int n = 12321;
if (n/10000==n%10 && n/1000%10==n/10%10)
    cout << "yes";

PM   Вверх
baldina
Дата 27.12.2010, 18:48 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



идея следующая: если удастся простым способом получить "перевернутое" число, его можно просто сравнить с исходным.
такой алгоритм потребует вычисления остатка от деления на 10 для всех цифр исходного числа и формирования из остатков перевернутого числа, умножаемого на 10.
т.е. получается довольно простой цикл.
пока я это писал Skevalt привел почти тот самый алгоритм. если "отсечь лишнее", получится попроще (и побыстрее).
Код

bool is_palindrome (unsigned x)
{
  int z = x;
  int y = 0;
  while (x>0)
  {
    y *= 10;
    y += x%10;
    x /= 10;
  }
  return (y==z);
}

PM MAIL   Вверх
mes
Дата 27.12.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(baldina @  27.12.2010,  17:36 Найти цитируемый пост)
 и текущую позицию p

Цитата(baldina @  27.12.2010,  17:36 Найти цитируемый пост)
 Здесь самая трудоемкая операция - возведение в степень.

может позицию хранить не как индекс, а как степень десяти ?
т.е. итерацию проводить не как ++/--, а как *=10 / /=10

Добавлено через 3 минуты и 40 секунд
Цитата(baldina @  27.12.2010,  17:48 Найти цитируемый пост)
идея следующая: если удастся простым способом получить "перевернутое" число, его можно просто сравнить с исходным.

у этого алгоритма есть недостаток возможно  переполнение и как следствие не правильный результат..

Добавлено через 4 минуты и 37 секунд
Цитата(baldina @  27.12.2010,  17:48 Найти цитируемый пост)
 и формирования из остатков перевернутого числа, умножаемого на 10.

а чем не устраивает хранение промежуточного числа как строки ?



--------------------
PM MAIL WWW   Вверх
mimik
Дата 27.12.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


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

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



Цитата(mes @  27.12.2010,  18:57 Найти цитируемый пост)
у этого алгоритма есть недостаток возможно  переполнение и как следствие не правильный результат..

в упор не вижу где?
Цитата(mes @  27.12.2010,  18:57 Найти цитируемый пост)
а чем не устраивает хранение промежуточного числа как строки ?

это тот же массив
PM   Вверх
baldina
Дата 27.12.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата

хранение промежуточного числа как строки

не устраивает ТС'а т.к. по условию массивы нельзя использовать.

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

Цитата

т.е. итерацию проводить не как ++/--, а как *=10 / /=10

не вижу смысла. операция должна проводиться не над текущей цифрой, а над предыдущей или следующей. так что можем выиграть лишь одно умножение на 10, стоит ли ради этого жертвовать ясностью?
хотя там есть небольшие возможности оптимизации, например можно более оптимально подсчитывать число цифр, вычисляя логарифм эффективным методом.
PM MAIL   Вверх
mes
Дата 27.12.2010, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mimik @  27.12.2010,  18:09 Найти цитируемый пост)
в упор не вижу где?

ну на примере unsigned char : 
126 -> [621] -> 109

та же проблема, но на других значениях есть и других целочисленных типов.. 
smile

Добавлено через 2 минуты и 52 секунды
Цитата(baldina @  27.12.2010,  18:14 Найти цитируемый пост)
не вижу смысла. операция должна проводиться не над текущей цифрой, а над предыдущей или следующей. так что можем выиграть лишь одно умножение на 10, стоит ли ради этого жертвовать ясностью?

это смотря как подходить к вопросу.. мне кажется можноэтим подходом как раз повысить ясность..сейчас попробую.. 



--------------------
PM MAIL WWW   Вверх
mimik
Дата 27.12.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


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

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



Цитата(mes @  27.12.2010,  19:21 Найти цитируемый пост)
126 -> [621] -> 109

да, ступил smile 

хотя при этом алгоритм может и работать правильно, надо проверить
PM   Вверх
mes
Дата 27.12.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mes @  27.12.2010,  18:21 Найти цитируемый пост)
 мне кажется можноэтим подходом как раз повысить ясность..сейчас попробую.. 

отвлекся.. вот выбрал минутку и сделал набросок :
Код

template <size_t Rank>
struct shift
{
   unsigned left(unsigned value) {
      return value * Rank;
   }
   unsigned right (unsigned value) {
      return value / Rank;
   }   
};

template <>
struct shift<0x10>
{
   unsigned left(unsigned value) {
      return value << 4;
   }
   unsigned right (unsigned value) {
      return value >> 4;
   }   
};

template <size_t Rank = 10>
struct DigIter {
  
  unsigned value;
  unsigned base;

  DigIter& operator++() {
       base = shift<Rank>::left(base); return *this; 
  }
  DigIter& operator--() {
       base = shift<Rank>::right(base); return *this; 
  } 
};




--------------------
PM MAIL WWW   Вверх
Dov
Дата 28.12.2010, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(ArniLand @  27.12.2010,  13:28 Найти цитируемый пост)
Можно использовать только арифметические/логические операции и операторы while/if. Массивы использовать нельзя.

Да чего уж там? Запрещать, так запрещать. Тогда уж и без if/while обойдёмся...  smile 
Код
bool isPalindrome(int val, int cnt)
{
    return val < 100 && cnt ? 
           val / 10 == val % 10 : cnt ? 
           val / (int)pow(10, cnt) % 10 == val % 10 ? 
           isPalindrome(val / 10, cnt - 2) : false : true;
}

int main()
{
    int  value = 12321;
    
    cout << value << " -" 
         << (isPalindrome(value, (int)log10(value)) ? " " : " not ")
         << "palindrome\n";

    return 0;
}


Цитата(ArniLand @  27.12.2010,  13:28 Найти цитируемый пост)
Начала с изучения основ

Цитата(ArniLand @  27.12.2010,  13:28 Найти цитируемый пост)
Сам придумать алгоритм я не могу

Цитата(ArniLand @  27.12.2010,  13:28 Найти цитируемый пост)
не является это признаком того что программированием я заниматься не смогу?

Ты бы, для начала, с полом определил(ась/ся) бы...   smile 





--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
mes
Дата 28.12.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Dov @  27.12.2010,  23:26 Найти цитируемый пост)
 Тогда уж и без if/while обойдёмся...  

тогда уж и без рекурсии smile

а вообще для 5ти-значного числа из задания, все гораздо проще :
Код

return a / 1000 ==   a / 10 % 10 + a % 10 * 10;


Добавлено через 2 минуты и 16 секунд
или, как было приведено выше :
Цитата(mimik @  27.12.2010,  17:41 Найти цитируемый пост)
(n/10000==n%10 && n/1000%10==n/10%10)




--------------------
PM MAIL WWW   Вверх
baldina
Дата 28.12.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



mes, все верно. вчера спешил и не сразу сообразил)))
точнее, сам себя запутал)

Это сообщение отредактировал(а) baldina - 28.12.2010, 10:32
PM MAIL   Вверх
mes
Дата 28.12.2010, 10:37 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Dov @  27.12.2010,  23:26 Найти цитируемый пост)
(int)log10(value)

http://liveworkspace.org/code/bbaad377991f...faf6e91ea7d57b8


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


любитель
****


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

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



Цитата(mes @  27.12.2010,  17:57 Найти цитируемый пост)
Цитата

идея следующая: если удастся простым способом получить "перевернутое" число, его можно просто сравнить с исходным.

у этого алгоритма есть недостаток возможно  переполнение и как следствие не правильный результат..

чтоб не было переполнения можно ведь переворачивать только половину числа.. 
Код

bool is_pal (unsigned a)
{

   unsigned len = value_len(a);
   unsigned len2 = len >> 1;
   
   unsigned b = 0;
   
   for (size_t i=0; i < len2; ++i)              
   {
      b *= 10;
      b += a % 10;
      a /= 10;
   }
   
   if (len % 2) a /= 10;
     
   return a == b;
      
}


Добавлено @ 11:19
вот еще один вариант получения длины числа (32х битного):
Код

template <size_t Len>
struct base
{
    enum { value = base<Len-1> :: value * 10 };
};
template <>
struct base<1>
{
    enum { value = 1 };
};
template <>
struct base<0> {};

size_t value_len(unsigned a)
{
    return          a < base<6>::value 
                    ? a < base<4>::value
                      ? a < base<2>::value 
                        ? 1 
                        : a < base<3>::value   
                          ? 2
                          : 3
                       : a < base<5>::value     
                         ? 4
                         : 5
                    : a < base<8>::value
                      ? a < base<7>::value  
                        ? 6
                        : 7  
                      : a < base<10>::value
                        ? a < base<9>::value 
                          ? 8
                          : 9
                        : 10;              
}

этот "switch" можно метагенерить, но мне сейчас лень об этом думать

Это сообщение отредактировал(а) mes - 28.12.2010, 11:26


--------------------
PM MAIL WWW   Вверх
baldina
Дата 28.12.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(mes @  28.12.2010,  11:17 Найти цитируемый пост)
чтоб не было переполнения можно ведь переворачивать только половину числа

 smile 

переворачивая половину числа можно не вычислять число цифр
Код

bool is_pal2 (unsigned x)
{
  if (x == 0)
    return true;
  if (x%10 == 0)
    return false;

  unsigned y = 0;
  while (x>y)
  {
    y *= 10;
    y += x%10;
    x /= 10;
  }
  return y == x || y/10 == x;
}


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


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(mes @  28.12.2010,  09:37 Найти цитируемый пост)
http://liveworkspace.org/code/bbaad377991f...faf6e91ea7d57b8

Чего там? У меня не открывается ссылка. Здесь выложи...



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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