Как найти число перевертыш

Продолжаем разбирать задачки с сайта Leetcode. В прошлый раз было про массив и сумму чисел, теперь тоже необычное. 

Условия

В переменной X лежит какое-то целое число

Задача — проверить, является ли это число палиндромом.

Задача со звёздочкой — проверить на наличие палиндрома, не используя строки.

Палиндром — это когда строка или число одинаково читается в прямом и обратном направлении:

121 — это палиндром.

А роза упала на лапу Азора — тоже палиндром (если не считать заглавных букв).

12321 — и это палиндром.

Решение, где используем строки

Самый простой способ проверить, число в переменной палиндром или нет, — преобразовать его в строку, выставить знаки задом наперёд и сравнить с оригиналом. Этим мы сразу решаем проблему отрицательных чисел, когда «−121»превращается в «121−» и сразу становится ясно, что это не палиндром.

Сначала решим это на Python. Тут вообще суть в одной строке:

X = 121
if str(X) == str(X)[::-1]:
    print("Это палиндром")
else:
    print("Это не палиндром")

Здесь мы использовали трюк с переворачиванием строки без её изменения — применили конструкцию [::-1]. Работает это так:

  • Первым параметром указывают начало, откуда начинать обработку строки. Раз ничего не указано, то начинаем с первого символа.
  • Второй параметр — на каком по счёту символе надо остановиться. Здесь тоже ничего нет, поэтому алгоритм пройдёт до конца строки.
  • Последний параметр — шаг и направление обработки. У нас указана минус единица, значит, алгоритм обработает строку справа налево, на каждом шаге считывая по символу.
  • В итоге этот код вернёт нам строку, собранную в обратном порядке, при этом с оригинальной строкой ничего не случится — она останется неизменной.

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

Теперь решим это же, но на JavaScript:

var X = 121;
if (X.toString().split("").reverse().join("") == X.toString()) {
    console.log("Это палиндром")
} else {
    console.log("Это не палиндром")
}

Здесь мы использовали другой метод пересборки:

  1. X.toString() — переводит число в строку.
  2. split(“”) — разбивает строку на массив из символов. В кавычках принцип разделения — если бы там была точка, то разделили бы на местах точек. А так как там пустота, то делится вообще по каждому из символов.
  3. reverse() — меняет элементы в массиве в обратном порядке.
  4. join(“”) — добавляет результат к пустой строке, чтобы на выходе получить строку в обратном порядке.

Решение без строк

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

Сделаем в JavaScript функцию, которая будет возвращать true, если в переменной лежит палиндром, и false — если нет. Всё остальное будем писать внутри этой функции:

function palindrome(x) {
}

Теперь обработаем три стандартные ситуации:

  1. Если в переменной лежит ноль, то это палиндром.
  2. Если переменная меньше ноля, то это не палиндром.
  3. Если переменная делится на 10 без остатка — это тоже не палиндром.

Запишем это на JavaScript:

function palindrome(x) {
    // если перед нами ноль — это палиндром
    if(x == 0) {
        return true;
    }
    // если число меньше нуля или делится на 10 без остатка — это не палиндром
    if(x < 0 || x%10 == 0){
        return false;
    }
}

Чтобы проверить, является ли число палиндромом или нет, можно сделать так: отрезаем от числа цифры справа по одной, добавляем их в начало нового числа и постоянно сравниваем новое и старое значение. Если они станут равны — перед нами палиндром. Читайте комментарии, чтобы вникнуть в то, что происходит в коде:

function palindrome(x) {
    // если перед нами ноль — это палиндром
    if(x == 0) {
        return true;
    }
    // если число меньше нуля или делится на 10 без остатка — это не палиндром
    if(x < 0 || x%10 == 0){
        return false;
    }
    // сюда будем собирать число в обратном порядке
    temp = 0;
    // а тут будем хранить промежуточные значения икса
    preX = x;
    // пока не дойдём до середины числа — повторяем цикл
    while (x > temp) {
        // берём самую правую цифру в числе — это остаток от деления на 10
        pop = x%10;
        // запоминаем старое значение переменной X
        preX = x;
        // и отрезаем от переменной последнюю цифру — делаем это через целую часть деления на 10
        x /= 10;
        // добавляем отрезанную цифру к обратной переменной
        temp = temp*10 + pop;
    }
    // если обратная переменная совпала с оставшейся половиной исходной переменной — это палиндром
    // мы добавляем сравнение с предыдущей версией исходной половины (которая на 1 цифру больше) на тот случай, если исходное число состояло из нечётного количества символов и его нельзя было бы разбить строго пополам
    if(x == temp || preX == temp)
        return true;
    // 
    else
        return false;
};

Для запуска кода просто вызываем функцию и передаём её нашу переменную:

// запускаем код
var X = 121;
console.log(palindrome(X));

Чтобы попрактиковаться, попробуйте сделать такое же, но на Python и не подглядывая в наш код.

Вёрстка:

Кирилл Климентьев

Интервью

Катерина Маковеева

Описание задачи

Программа принимает на вход число и определяет, является ли оно палиндромом.

Решение задачи

  1. Принимаем число и записываем его значение в переменную.
  2. Создаем еще одну переменную и помещаем в нее то же самое значение.
  3. Далее при помощи цикла while мы «переворачиваем» исходное число, то есть находим как оно пишется в обратном порядке. Мы уже решали такую задачу ранее.
  4. Далее сравниваем полученное число с сохраненной ранее копией первоначального числа. Если они равны, то исходное число — это палиндром.
  5. Выводим полученный результат на экран.
  6. Конец.

Исходный код

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

n = int(input("Введите число:"))
temp = n
rev = 0
while(n > 0):
    dig = n % 10
    rev = rev * 10 + dig
    n = n // 10
if(temp == rev):
    print("Это палиндром!")
else:
    print("Это не палиндром!")

Объяснение работы программы

  1. Пользователь вводит число и оно записывается в переменную n.
  2. Затем это же число дублируется в переменную temp.
  3. Далее при помощи уже разобранной нами процедуры число n записывается в обратном порядке и сохраняется в переменной rev.
  4. Затем это число (находящееся в переменной rev) сравнивается с сохраненной нами ранее копией введенного числа (которая находится в переменной temp).
  5. Если эти числа равны, то исходное число является палиндромом.
  6. В противном случае оно палиндромом не является.
  7. В завершении мы выводим конечный результат на экран.

Результаты работы программы

Пример 1
Введите число:121
Это палиндром!
 
Пример 2
Введите число:567
Это не палиндром!

Примечание переводчика

Как и в прошлом примере, при помощи методов строк эту задачу можно решить гораздо короче. Предоставим читателям самим это сделать.

ЗАДОМ НАПЕРЁД

Наука и жизнь // Иллюстрации

Числовой палиндром — это натуральное число, которое читается слева направо и справа налево одинаково. Иначе говоря, отличается симметрией записи (расположения цифр), причём число знаков может быть как чётным, так и нечётным. Палиндромы встречаются в некоторых множествах чисел, удостоенных собственных названий: среди чисел Фибоначчи — 8, 55 (6-й и 10-й члены одноимённой последовательности); фигурных чисел — 676, 1001 (квадратное и пятиугольное соответственно); чисел Смита — 45454, 983389. Указанным свойством обладает также всякий репдиджит, например 2222222 и, в частности, репьюнит*.

Палиндром можно получить как результат операций над другими числами. Так, в книге «Есть идея!» известного популяризатора науки Мартина Гарднера в связи с этой задачей упоминается «гипотеза о палиндромах». Возьмём любое натуральное число и сложим его с обращённым числом, то есть записанным теми же цифрами, но в обратном порядке. Проделаем то же действие с получившейся суммой и будем повторять его до тех пор, пока не образуется палиндром. Иногда достаточно сделать всего один шаг (например, 312 + 213 = 525), но, как правило, требуется не менее двух. Скажем, число 96 порождает палиндром 4884 только на четвёртом шаге. В самом деле:

96 + 69 = 165,

165 + 561 = 726,

726 + 627 = 1353,

1353 + 3531 = 4884.

А суть гипотезы в том, что, взяв любое число, после конечного числа действий мы обязательно получим палиндром.

Можно рассматривать не только сложение, но и другие операции, включая возведение в степень и извлечение корней. Вот несколько примеров того, как при их помощи из одних палиндромов получаются другие:

ИГРЫ ЦИФР

До сих пор мы рассматривали в основном составные числа. Теперь обратимся к числам простым. В их бесконечном множестве имеются немало любопытных экземпляров и даже целые семейства палиндромов. Только среди первых ста миллионов натуральных чисел насчитывается 781 простой палиндром, причём двадцать приходятся на первую тысячу, из них четыре числа однозначные — 2, 3, 5, 7 и всего одно двузначное — 11. С такими числами связано немало интересных фактов и красивых закономерностей.

Во-первых, существует единственный простой палиндром с чётным числом цифр — 11. Другими словами, произвольный палиндром с чётным числом цифр, бóльшим двух, число составное, что нетрудно доказать на основе признака делимости на 11.

Во-вторых, первой и последней цифрами любого простого палиндрома могут быть только 1, 3, 7 или 9. Это следует из известных признаков делимости на 2 и на 5. Любопытно, что все простые двузначные числа, записанные с помощью перечисленных цифр (за исключением 19), можно разбить на пары чисел-«перевёртышей» (взаимно обращённых чисел) вида и , где цифры a и b различны. Каждая из них, независимо от того, какое число стоит на первом месте, читается одинаково слева направо и справа налево:

13 и 31, 17 и 71,

37 и 73, 79 и 97.

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

Кроме того, среди простых трёхзначных палиндромов встречаются пары чисел, у которых средняя цифра отличается всего на 1:

181 и 191, 373 и 383,

787 и 797, 919 и 929.

Аналогичная картина наблюдается и у бо`льших простых чисел, например:

94849 и 94949,

1177711 и 1178711.

Простые числа-палиндромы могут «задаваться» разными симметричными формулами, которые отражают особенности их записи. Это хорошо видно на примере пятизначных чисел:

Кстати, простые многозначные числа вида встречаются, очевидно, только среди репьюнитов. Таких чисел известно пять. Примечательно, что у каждого из них количество цифр выражается простым числом: 2, 19, 23, 317, 1031. А вот среди простых чисел, у которых все цифры, кроме центральной, единицы, был обнаружен палиндром весьма внушительной длины — в нём 1749 цифр:

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

А интересен он тем, что содержит 11 811 цифр, которые можно разбить на три палидромические группы, причём в каждой группе количество цифр выражается простым числом (5903 или 5).

ПРИМЕЧАТЕЛЬНЫЕ ПАРЫ

Любопытные палиндромические закономерности просматриваются и в группах простых чисел, в записи которых присутствуют определённые цифры. Скажем, только цифры 1 и 3, причём в каждом числе. Так, двузначные простые числа составляют упорядоченные пары 13 — 31 и 31 — 13, из шести трёхзначных простые сразу пять чисел, среди которых есть два палиндрома: 131 и 313, а ещё два числа образуют пары «перевёртышей» 311 — 113 и 113 — 311. Во всех этих случаях составленные пары наглядно представляются в виде числовых квадратов (рис. 1).

Рис. 1

Своими свойствами они напоминают магический и латинский квадраты. Например, у среднего квадрата сумма чисел, стоящих в каждой строке и в каждом столбце, равна 444, на диагоналях — 262 и 626. Сложив числа из всех клеток, получим 888. И что характерно, каждая сумма — палиндром. Даже просто выписывая без пробела несколько чисел из одной таблицы, получим новые палиндромы: 3113, 131313131 и т. д. Какое наибольшее число можно составить таким способом? Будет ли оно палиндромом?

Если в каждую из пар 311 — 113 и 113 — 311 добавить 131 или 313, образуются четыре палиндромические тройки. Запишем одну из них в столбик:

311

131

113

Как видим, и сами числа, и нужная их комбинация дают о себе знать при прочтении в разных направлениях. Кроме того, расположение цифр симметрично, а их сумма в каждой строке, каждом столбце и на одной из диагоналей выражается простым числом − 5.

Надо сказать, рассмотренные числа интересны и сами по себе. Например, палиндром 131 — простое циклическое число: при любых последовательных перестановках первой цифры на последнее место он порождает простые числа 311 и 113. Можете ли вы указать другие простые палиндромы, обладающие таким же свойством?

А вот пары чисел-«перевёртышей» 13 — 31 и 113 — 311 при возведении в квадрат дают также пары «перевёртышей»: 169 — 961 и 12769 — 96721. Любопытно, что даже суммы их цифр оказались связаны хитрым образом:

(1 + 3)2 = 1 + 6 + 9,

(1 + 1 + 3)2 = 1 + 2 + 7 + 6 + 9.

Добавим, что среди натуральных чисел имеются и другие пары «перевёртышей» с подобным свойством: 103 — 301, 1102 — 2011, 11113 — 31111 и др. Чем объясняется подмеченная закономерность? Чтобы ответить на этот вопрос, нужно понять, что особенного в записи указанных чисел, какие цифры и в каком количестве могут в ней присутствовать.

ЧИСЛОВОЙ КОНСТРУКТОР

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

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

Рис. 2

Легко видеть, что общее количество строк и столбцов — число простое (17). К тому же простые числа и суммы цифр: выделенных красным фрагментов (17); каждой строки, за исключением первой (5, 11, 17, 19, 23); третьего, пятого, седьмого и девятого столбцов (7, 11) и «лесенки» из единиц, образующей боковые стороны треугольника (11). Наконец, если двигаться параллельно указанным «сторонам» и складывать по отдельности цифры третьего и пятого рядов (рис. 3), получим ещё два простых числа (17, 5).

Рис. 3

Продолжая построение, можно сконструировать на основе данного треугольника более сложные фигуры. Так, ещё один треугольник с аналогичными свойствами нетрудно получить, двигаясь с конца, то есть начать с последнего числа, вычёркивая на каждом шаге две одинаковые симметрично расположенные цифры и переставляя или заменяя другие — 3 на 1 и наоборот. При этом сами цифры следует выбирать с таким расчётом, чтобы образующееся в итоге число оказалось простым. Объединив обе фигуры, получим ромб с характерным узором из цифр, скрывающим в себе немало простых чисел (рис. 4). В частности, сумма выделенных красным цветом цифр равна 37.

Рис. 4

Другой пример — треугольник, полученный из исходного после добавления к нему шести простых палиндромов (рис. 5). Фигура сразу привлекает внимание своим изящным обрамлением из единиц. Её окаймляют два простых репьюнита одинаковой длины: 23 единицы составляют «основание» и ещё столько же — «боковые стороны» треугольника.

Рис. 5

Ещё несколько фигур

Можно составить также многоугольные фигуры из чисел, обладающие определёнными свойствами. Пусть требуется построить фигуру из простых палиндромов, записанных с помощью 1 и 3, у каждого из которых крайние цифры — единицы, а сумма всех цифр и общее количество единиц в строке — простые числа (исключение — однозначный палиндром). Кроме того, простым числом должно выражаться общее количество строк, а также цифр 1 либо 3, встречающихся в записи.

На рис. 6 приведено одно из решений задачи — «домик», сконструированный из 11 различных палиндромов.

Рис. 6

Конечно, не обязательно ограничиваться двумя цифрами и требовать наличия в записи каждого используемого числа всех указанных цифр. Скорее, наоборот: ведь именно их необычные сочетания придают своеобразие узору фигуры. В подтверждение этому приведём несколько примеров красивых палиндромических зависимостей (рис. 7−9).

Рис. 7

Рис. 8

Рис. 9

Теперь, вооружившись таблицей простых чисел, вы и сами сконструируете фигуры вроде предложенных нами.

А напоследок ещё одна диковинка — треугольник, буквально пронизанный вдоль и поперёк палиндромами (рис. 10). В нём 11 строк из простых чисел, а столбцы образованы репдиджитами. И главное: ограничивающий фигуру с боков палиндром 193111111323111111391 — число простое!

Рис. 10

Комментарии к статье

*Число Смита — составное число, сумма цифр которого равна сумме цифр его простых делителей.

Репдиджит — натуральное число, в записи которого все цифры одинаковые.

Репьюнит — натуральное число, записанное с помощью одних только единиц.

I didn’t notice any answers that solved this problem using no extra space, i.e., all solutions I saw either used a string, or another integer to reverse the number, or some other data structures.

Although languages like Java wrap around on integer overflow, this behavior is undefined in languages like C. (Try reversing 2147483647 (Integer.MAX_VALUE) in Java)
Workaround could to be to use a long or something but, stylistically, I don’t quite like that approach.

Now, the concept of a palindromic number is that the number should read the same forwards and backwards. Great. Using this information, we can compare the first digit and the last digit. Trick is, for the first digit, we need the order of the number. Say, 12321. Dividing this by 10000 would get us the leading 1. The trailing 1 can be retrieved by taking the mod with 10. Now, to reduce this to 232. (12321 % 10000)/10 = (2321)/10 = 232. And now, the 10000 would need to be reduced by a factor of 2. So, now on to the Java code…

private static boolean isPalindrome(int n) {
    if (n < 0)
        return false;

    int div = 1;
    // find the divisor
    while (n / div >= 10)
        div *= 10;

    // any number less than 10 is a palindrome
    while (n != 0) {
        int leading = n / div;
        int trailing = n % 10;
        if (leading != trailing)
            return false;

        // % with div gets rid of leading digit
        // dividing result by 10 gets rid of trailing digit
        n = (n % div) / 10;

        // got rid of 2 numbers, update div accordingly
        div /= 100;
    }
    return true;
}

Edited as per Hardik’s suggestion to cover the cases where there are zeroes in the number.

0 / 0 / 1

Регистрация: 11.12.2013

Сообщений: 28

1

Определить, является ли число палиндромом

06.04.2014, 16:00. Показов 37810. Ответов 4


Студворк — интернет-сервис помощи студентам

Помогите, пожалуйста с заданием! Буду очень благодарен!
Дано натуральное число N. Определить, является ли это число палиндромом (перевертышем) с учетом всех цифр десятичной записи числа, не используя при этом преобразования в строки. Примеры чисел-палиндромов: 7, 212, 3443, 54345 и т.д.



0



Lexeq

1147 / 739 / 483

Регистрация: 21.01.2014

Сообщений: 1,903

06.04.2014, 21:15

2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
namespace CA_9
{
    class Program
    {
 
        static void Main(string[] args)
        {
            int num = int.Parse(Console.ReadLine());
            Console.WriteLine(IsPalindrome(num));
            Console.ReadKey(true);
        }
        
        static bool IsPalindrome(int num)
        {
            if (num >= 0 && num <10)
                return true;
            int numLength = GetLength(num);
            int[] digits = new int[numLength];
            for (int i = numLength - 1; i >= 0; i--) {
                digits[i] = num % 10;
                num /= 10;
            }
            for (int i = 0; i < numLength/2; i++) {
                if (digits[i] != digits[numLength - i - 1])
                    return false;
            }
            return true;
        }
        
        static int GetLength(int num)
        {
            int n = 0;
            while (num > 0) {
                num /= 10;
                n++;
            }
            return n;
        }
    }
}



1



ValeryS

Модератор

Эксперт по электронике

8801 / 6584 / 894

Регистрация: 14.02.2011

Сообщений: 23,145

06.04.2014, 21:21

3

без массива я бы так сделал

C#
1
2
3
4
5
6
7
8
int a=n;
int b=0;
while(a)
{
 b=b*10;
 b=b+a%10;
}
if(n==b)



1



pycture

1195 / 588 / 88

Регистрация: 20.09.2012

Сообщений: 1,881

06.04.2014, 21:25

4

C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main()
{
    int num = int.Parse(Console.ReadLine());
    Console.WriteLine((num == 0) || (reverse(num, 0) == num));
    Console.ReadKey(true);
}
 
private static int reverse(int num, int acc)
{
    while (num > 0) { acc = acc * 10 + num % 10; num /= 10; }
    return acc;
}



1



Nozd

2 / 2 / 0

Регистрация: 28.03.2014

Сообщений: 9

06.04.2014, 22:59

5

Как вариант.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main()
        {
            uint a = uint.Parse(Console.ReadLine());
            uint b = a;
            var col = new List<uint>();
            while (b > 0)
            {
                col.Add(b % 10);
                b = b / 10;
            }
            b = 0;
            col.Reverse();
            for(int mcol = 0; mcol < col.Count; mcol++)
                b = b + col[mcol] * (uint)Math.Pow(10, mcol);
            if (a == b)
                Console.WriteLine("True");
            else
                Console.WriteLine("False");
            Console.ReadLine();
        }



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

06.04.2014, 22:59

Помогаю со студенческими работами здесь

Определить, является ли введенное число любой разрядности палиндромом
Определить, является ли введѐнное число любой разрядности
палиндромом (например, 1234321 –…

Является ли число палиндромом?
Определить, является ли введённое число любой разрядности палиндромом (например, 1234321 –…

Выяснить, является ли число палиндромом
Дано четырехзначное натуральное число n. Выяснить, является ли оно палиндромом («перевертышем»),…

Проверить, является ли заданное действительное число палиндромом
Проверить, является ли заданное действительное число палиндромом (остаётся таким же после записи в…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

5

Добавить комментарий