Как найти число палиндром в диапазоне

I need some help with below:

write a function (main) which will ask the user to enter a starting and ending number range (inclusive). Count through the numbers using a while loop. Add the number into the total only if it is a palindrome (call isNumberPalindrome). Print the total after adding the numbers.’

What I have so far for this (main) function is…

def main():
start = int(input("Enter a number to start counting at:"))
end = int(input("Enter a number to end counting at:"))
while start <= end:
    print(start)
    start = start + 1

AND here is what I have for my (isNumberPalindrome) function.

def isNumberPalindrome(s):
if len(s) < 1:
        return True
else:
    if s[0] == s[-1]:
        return isNumberPalindrome(s[1:-1])
    else:
        return False

So far my (main) function asks for user input(starting and ending number) and counts them using a while loop. I have no idea what to add to my code for (main) function next to achieve «Add the number into the total only if it is a palindrome (call isNumberPalindrome). Print the total after adding the numbers.»

Thanks for the help.

So far with the code provided to me, this is what happens.

Enter a number to start counting at:1
Enter a number to end counting at:6
1
Traceback (most recent call last):
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 38, in <module>
main()
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 33, in main
if isNumberPalindrome(start):
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 18, in isNumberPalindrome
if len(s) < 1:
TypeError: object of type 'int' has no len()

Does anyone know what is wrong?

Продолжаем разбирать задачки с сайта 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 и не подглядывая в наш код.

Вёрстка:

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

f(k) — число чисел-палиндромов из k разрядов. Тогда

  • f(2k) = 9·10k-1;
  • f(2k + 1) = 9·10k.

Девятка отвечает за цифры старшего разряда — от единицы до девяти. Степень десятки — за остальные разряды из старшей половины числа.

g(k) — число чисел-палиндромов из не более чем k разрядов. Тогда

  • g(2k) = 2·10k — 2;
  • g(2k + 1) = 11·10k — 2.

Доказывается по индукции (g(n + 1) = g(n) + f(n + 1)).

h(n) — число чисел-палиндромов не более n. Я покажу на примере как его можно сосчитать быстро. Пусть n = 345678. Разобъём все палиндромы не более n на группы:

     ? - палиндромы длины один. Их f(1)
    ?? - палиндромы длины два. Их f(2)
   ??? - палиндромы длины три. Их f(3)
  ???? - палиндромы длины четыре. Их f(4)
 ????? - палиндромы длины пять. Их f(5)

1????1 - таких палиндромов 100 (все палиндромные цифровые строки длины 4)
2????2 - тоже самое (первые цифры от единицы до 3 - 1)

30??03 - таких палиндромов 10 (все палиндромные цифровые строки длины 2)
31??13 - тоже самое
32??23 - тоже самое
33??33 - тоже самое (вторые цифры от нуля до 4 - 1)

340043 - такой палиндром один (все палиндромные цифровые строки длины 0)
341143 - тоже самое
342243 - тоже самое
343343 - тоже самое
344443 - тоже самое (третьи цифры от нуля до 5 - 1)

345543 - такой палиндром один, но надо отдельно проверить
         что он не больше n

Получается такая программа:

def ps_count(k):
    """ число палиндромных строк длины k """
    return 10 ** ((k + 1) // 2)


def p_count_10p(k):
    """ число чисел-палиндромов не более k разрядов """
    return 10 ** ((k + 1) // 2) + 10 ** (k // 2) - 2


def p_count(n):
    """ число чисел-палиндромов не более n """

    if n == 0:
        return 0

    digits = tuple(map(int, str(n)))
    m = len(digits)

    # короткие палиндромы
    c = p_count_10p(m - 1)

    for i in range((m + 1) // 2):
        # палиндромы вида ABC????CBA
        c += (digits[i] - (0 if i > 0 else 1)) * ps_count(m - 2 * (i + 1))

    if digits[:m // 2 - 1::-1] <= digits[(m + 1) // 2:]:
        # палиндром вида ABCDEEDCBA
        c += 1

    return c


def main():
    n1, n2 = map(int, input().split())
    # число чисел-палиндромов диапазоне [n1, n2]
    print(p_count(n2) - p_count(n1 - 1))


main()
echo 1026376 1_000_000_000_000_000  | python pcount.py
109997973

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

Как определить число-палиндром

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

Как определить число-палиндром

Инструкция

Согласно определению, число-палиндром является таковым, если его можно равнозначно прочитать слева направо и справа налево. Так, например, 2002 остается собой даже если зеркально отразить его в обратную сторону. К несчастью, компьютер не в состоянии рассмотреть число целиком. Решение задачи будет заключаться в том, что машина последовательно сравнит первую цифру с последней, вторую с предпоследней и далее.

Определите количество цифр в числе. Пусть пользователь вводит число в переменную X. Тогда для определения количества цифр в числе стоит написать цикл: for(n=0; N

Разбейте число на цифры. Сделать это можно при помощи обычного деления на 10: создав цикл, который последовательно делит X на 10 n раз и сохраняет остаток от деления в заранее подготовленный массив. Для удобства заполнять массив можно сразу по значению n. Во избежание проблем с делением убедитесь, что X задано целочисленно (int).for(n; n>0; n—){A[n]=X%10; X=X10;}

Проведите оценку. Создайте цикл, сравнивающий значения пар элементов до конца или до тех пор, пока не попадется различие: for(n=0; n

При написании кода не забудьте подключить библиотеку math.h для операции возведения в степень. Кроме того, добавьте в конце getch(); чтобы консоль не закрывалась сразу после завершения программы. Очевидно, что если вам нужно найти количество чисел-палиндромов в заданном диапазоне, то операцию проверки придется повторять циклически.

Видео по теме

Войти на сайт

или

Забыли пароль?
Еще не зарегистрированы?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

0 / 0 / 0

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

Сообщений: 5

1

Палиндромы в диапазоне чисел

02.10.2022, 11:48. Показов 522. Ответов 3


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

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



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

02.10.2022, 11:48

Ответы с готовыми решениями:

Найти все палиндромы, не превышающие 100, которые при возведении в квадрат также дают палиндромы
Натуральное число называется палиндромом, если его запись читается одинаково с начала и с конца…

Найти палиндромы в диапазоне чисел
Подсчитать количество натуральных чисел n (111 &lt;= n &lt;= 999), являющихся палиндромами, и распечатать…

В заданном диапазоне натуральных чисел найти все палиндромы
Помогите пожалуйста, я новичок в Visual Basic, мне задали сделать: Приложение, которое в заданном…

Найти палиндромы в указанном диапазоне [m, m+n]
Проблема состоит в том,чтобы найти палиндромы в указанном диапазоне . При этом использовать только…

3

Элд Хасп

Модератор

Эксперт .NET

13781 / 9993 / 2661

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

Сообщений: 29,763

Записей в блоге: 2

02.10.2022, 12:23

2

Цитата
Сообщение от Ravairay
Посмотреть сообщение

Прогу на определение числа палиндромы

Два метода расширения:

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
namespace Core2022
{
    public static partial class NumberExtensions
    {
        public static bool IsPalindrome(this uint number)
        {
            List<uint> digits = new List<uint>(10);
 
            do
            {
                digits.Add(number % 10);
                number /= 10;
            } while (number > 0);
            int halfLength = digits.Count / 2;
            for (int i = 0, j = digits.Count - 1; i < halfLength; i++, j--)
            {
                if (digits[i] != digits[j])
                    return false;
            }
            return true;
        }
 
        public static IEnumerable<uint> GetPalindromesFromRange(this uint begin, uint length)
        {
            uint end = begin + length;
            for (uint i = begin; i < end; i++)
            {
                if(i.IsPalindrome())
                    yield return i;
            }
        }
    }
 
}

Иcпользование:

C#
1
WriteLine(string.Join(", ", 0u.GetPalindromesFromRange(300)));
Консоль0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292



0



0 / 0 / 0

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

Сообщений: 5

02.10.2022, 12:44

 [ТС]

3

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

Миниатюры

Палиндромы в диапазоне чисел
 



0



Модератор

Эксперт .NET

13781 / 9993 / 2661

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

Сообщений: 29,763

Записей в блоге: 2

02.10.2022, 13:31

4

Цитата
Сообщение от Ravairay
Посмотреть сообщение

Может есть возможность скинуть целиком проект?

Я не делал отдельного проекта.

Цитата
Сообщение от Ravairay
Посмотреть сообщение

выдаёт такую вот ошибку.

Вы не должны были удалять класс Program.
Класс NumberExtensions создаётся в отдельном файле через меню Проекта -> Добавить -> Класс.

Когда вы создавали Решение, то у вас был класс Program с методом Main.
Вот в тело метода и нужно было записать WriteLine(string.....



1



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

02.10.2022, 13:31

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

Найти все палиндромы в диапазоне от n до m, которые при возведении в квадрат также дают палиндром
програма
Найти все числа палиндромы в диапазоне от n до m которые при возведении в квадрат так же…

Палиндромы, которые при возведении в квадрат также дают палиндромы
Доброго времени суток, помогите решить задачу в C++Builder : &quot;Найдите целые числа – палиндромы,…

Найти все числа-палиндромы, которые не больше 100, и их квадраты тоже палиндромы
Натуральное число называется палиндромом, если его запись читается однинакого с начала и с конца…

Найти в заданном тексте, состоящем из n строк, все слова палиндромы и числа палиндромы
Сроки жутко горят :( поэтому надеюсь на вашу помощь:
Задача:
Найти в заданном тексте, состоящем…

Найти числа от 1 до 99 — палиндромы, которые при возведении в квадрат также дают палиндромы (используя циклы)
Задание:
Натуральное число является палиндромом, если его запись читается одинаково с начала и с…

Найти целые числа палиндромы, которые при возведении в квадрат также дают палиндромы (22^2=484)
Найти целые числа-палиндромы, которые при возведении в квадрат также дают палиндромы (22^2=484)…

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

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

4

Понравилась статья? Поделить с друзьями:
  • Как найти среднее квадратичное отклонение онлайн
  • Крупный почерк у ребенка как исправить
  • Как бесплатно найти домашний телефон в москве
  • Как составить электронную формулу элемента для элемента se
  • Как найти игрока на покер