Как определять, если все цифры целого числа равны

В цепи, которая содержит целое число: как я могу проверять, что все цифры равны, но только используя математические операции?.

Например: как я могу знать, что "1111" или "999999" у них все Ваши равные числа есть, не используя списков, без того, чтобы это анализировать как string, ни сходные? (Также как и также, подтверждать, что "2222220" он не выполняет эту проверку).

Анализ должен быть исключительно числовым - математическим.


Если он собирался анализировать это, как string, он просто подтвердил бы в цикле, что первый характер равен каждому из последующих. Однако, со мной случилось, что, может быть, возможно реализовывать с операциями на числе... Существует какой-то способ это делать?

35
задан 14.11.2016, 15:25
11 ответов

Я думаю, что ты объяснился плохо, и из-за Г©so существовал столько confusiГіn. Начала у тебя есть один nГєmero, не "цепь" , и ты хочешь знать, они dГ-gitos nГєmero тот же самый ли все dГ-gito. И ты хочешь сделать это из-за mГ©todos numГ©ricos, не конвертируя nГєmero ни в цепь ни в список.

Одна soluciГіn:

def digitos_iguales(n):
    m, c = divmod(n, 10)
    d = c

    while m>0 and d == c:
        m, d = divmod(m, 10)

    return (d==c)
15
ответ дан 24.11.2019, 12:38

Ответ ChemaCortes правилен и простой способ это делать, как говоришь ты:

Анализ должен быть исключительно числовым - математическим

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

from math import log10

def digitos_iguales(num):
    return num == 0 or num % ((10**int(log10(abs(num))+1) - 1) // 9) == 0

Математическое размышление - следующие:

Если целое число считает все равные цифры, тогда это число, разделенное между одной из Ваших цифр равно целому числу с тем же числом цифр, но будучи всеми ими 1.

Например:

44544/4 = 11136

44444/4 = 11111

Предыдущее легко приходить к заключению:

Каждое число, у которого есть все Ваши равные цифры, - делимое между числом равного количества цифр, но в котором всех Ваших цифр 1.

Это означает, что оставшейся части деления между обоими (модуль) 0:

>>> 44444 % 11111 = 0
>>> 44844 % 11111 = 400

Следовательно наша проблема ограничивается тем, что получает соответствующее целое число, у которого есть то же количество цифр, что и наше число, но которое всех их 1.

Эти числа (1, 11, 111, 1111, 11111, 111111, и т.д.) формируют sequencia, который мы можем видеть здесь, и который отвечает на простую формулу:

f (n) = (10^n - 1) / 9

Где n - число цифр.

Например число этого типа с 5 цифрами:

 f(5) = (10^5 - 1) / 9
 f(5) = (10000 - 1) / 9
 f(5) = (99999) / 9
 f(5) = 11111

Решенный это у нас появляется другая проблема; мы нуждаемся в том, чтобы узнать количество цифр, у которого есть наше число. Чтобы получать число цифр используя математику мы можем бросать логаритма в основание 10 (используя только Вашу целую часть):

digitos = int(log10(n)) + 1

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

Если мы применим предыдущее коду Пайтон, мы будем нуждаться в том, чтобы вычислить логаритм в основании 10, для этого мы прибегаем к модулю math стандартной библиотеки, чтобы использовать функцию log10().

С этим наш код был бы:

from math import log10

def digitos_iguales(num):
    return num % ((10**int(log10(num))+1) - 1) // 9) == 0

Это функционирует, но есть две проблемы:

  • Если мы вводим отрицательное число, переводчик бросает в нас ошибку типа:

    ValueError: math domain error

    это проистекает, чтобы пробовать вычислять логаритм отрицательного числа, чтобы это решать, мы используем абсолютную стоимость для этого вычисления посредством предсооруженной функции python abs()

  • Решенный предыдущее, если целого числа, которое мы вводим, 0, бросает нам ту же ошибку (log (0)). Чтобы это решать достаточно использовать один or перед равенством, чтобы отказываться от этого случая следующей формы:

num == 0 or num % ((10**int(log10(abs(num))+1) - 1) // 9) == 0

С этим мы прибыли в функцию, которую я поместил в начало.

Если у тебя есть число в грубой цепи делать:

n = int(cadena)

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

P.D: благодаря Относящемуся к Богородице из-за наблюдений на моем начальном коде, которые были много помощи, чтобы это улучшать. (видеть комментарии).

53
ответ дан 24.11.2019, 12:38
  • 1
    Твой ответ действительно превосходный. Какие-то детали: 1. , Когда ú ltimo dí gito - 0, пример 110, он приносит n//0 (ошибку). Это может подлатывать с prá cticamente то же свойство, которое ты использовал: 333%111==0 в€ Ђ n. 2. , После упорядочивая это, digitos_iguales(0) tambié n darí в ошибку, и agregarí в специальный случай для 0. 3. отрицательных Целых чисел :-) Он решен fá cil с abs(). rextester.com/EBGE40597 – Mariano 12.11.2016, 14:33
  • 2
    Большое спасибо из-за наблюдений @Mariano. Она 2ª и 3ª conocí в (поэтому я поместил, что funció n он был vá lida для больших целых чисел 0). Не tení в большое количество времени и decidí оставлять ее así чтобы завершать ее despué в. Тем не менее она 1ª (если ú ltimo dí gito 0) я pasó полностью, один из моих clá sicos глупые вирусы я должен говорить.... XD. С твоим разрешением я изменил có я говорю продолжая твои рекомендации (копируя má s хорошо... XD). Оригинально está funció n - modificací on чего-то, что я сделал, чтобы отвечать на вопрос Прохект Эйлера . – FJSevilla 12.11.2016, 14:57
  • 3
    Мой комментарий шел só это в детали (он препятствовал тому, что он был для того, чтобы ты использовал ее). Важное уже было в твоем ответе: 10^0+10^1+10^2+...+10^n как mú ltiplo этих nú морские окуни, и свойство, его быть =(10^n-1)/9. Я думаю, что это ответ canó nica и serí в эффектный, если в algú n другой momento/dí в seguí s завершая детали в descripció n, для того, чтобы он остался как ссылка на будущий лекторат (уже tení в принятый решение наставить вознаграждение в вопросе). – Mariano 12.11.2016, 15:13

Это было должно делать работу.

s = "1111"
if s.count(s[:1]) == len(s):
    print("todos iguales")

Edit

Сейчас, когда я перечитываю вопрос, я понимаю, что ты не хочешь проанализировать цепь, а число, это сделает работу:

s = "1111"
n = int(float(s))
ultimoDigito = n % 10
todosIguales = True
while (n != 0) & (todosIguales):
    digito = n % 10
    n = n // 10
    todosIguales = digito == ultimoDigito

if todosIguales:
    print("todos son iguales")
else:
    print("hay al menos un dígito diferente")
5
ответ дан 24.11.2019, 12:38
  • 1
    Просвет, но это было бы используя число как string или нет? Так как используя длину (len) " clasificas" в число как слово. – Facu Arg 12.11.2016, 02:55

Я верю в то, что это было, которое ты имеешь в виду. Чтобы это решать, не используя списков, ты можешь принимать как базовый первый характер и с этого времени делать сравнение с остальными символами string, например:

def funcion(n):
    flag = False
    for i in range(0,len(n)):
        if n[0] != n[i]:
            print "este numero es diferente a los demas --> %s" %n[i]
            flag = True
    if flag:
        print "se encontraron diferencias..."
    else:
        print "todos los numeros son iguales..."
funcion("1111")

Надеялся помочь с этим! Привет! Happy conding;)

3
ответ дан 24.11.2019, 12:38

С перекурсивной функцией, эквивалентной функции ChemaCortes

def todosiguales(n,d=False):
  if n<10:
    return True if not d else n==d
  else:
    m, r = divmod(n, 10)
    return (not d or r==d) and todosiguales(m, r)
3
ответ дан 24.11.2019, 12:38

AquГ - я оставляю одну тебе soluciГіn, надеюсь, что он подает тебя и помогает, с которым estГ©s реализовывая.

def NumerosIguales(numero)
    numero = abs(numero)
    if numero < 9:
       return "Todos son iguales"
    ultimo = numero % 10
    while (numero != 0):
       digito = n % 10
       if digito != ultimo:
          return "Existe uno diferente"
       numero = numero  // 10
    return "Todos son iguales"
3
ответ дан 24.11.2019, 12:38

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

Поскольку я могу знать, что у "1111" есть все Ваши равные числа, не могут использовать списки, анализировать это как string, и т.д.

Возможно интерпретировать это двух форм.

  1. Знать, что у него есть Ваши равные числа, без необходимости использовать списки, это анализировать как string.

  2. Не используя списков, анализируя это как string.

Несмотря на это, я могу давать ответ "оптом". Я буду предполагать, что это второе.

Не могут, так как strings - цепи символов, а именно, вектор unidimensional, что является тем же самым, что и список.

string "1111" это список, ['1', '1', '1', '1']... Возможно знать, равны ли все, не пробегая списка? Нет, это не является возможным, и это значит, что на уровне бит необходим сравнивать каждый элемент с Вашим следующим.

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

1
ответ дан 24.11.2019, 12:38

Я понимаю, что анализ должен быть исключительно математическим

Все же, здесь я оставляю версию, используя Expresiones Regulares

#python 2.7.6

import re

def digitos_iguales(numero):
    cadena = str(abs(int(numero)))
    return re.match( r'^'+cadena[0]+'{'+str(len(cadena))+'}$', cadena) != None;

Результаты:

print digitos_iguales(-101) #False
print digitos_iguales(101) #False
print digitos_iguales(-111) #True
print digitos_iguales(111) #True
print digitos_iguales(0) #True

Demo

0
ответ дан 24.11.2019, 12:38

Похожий на ответ ChemaCortes:

Обновленный (проще и надежный перед overflows)

# Devuelve True si el numero tiene todos sus digitos iguales
#  n deberria ser un numero entero positivo
def todosiguales(n):
    dig = n % 10
    n = n // 10      
    while n > 0:
       if n % 10 != dig:
            return False
       n = n // 10      
    return True

# para testear    
def test_todosiguales(n):
   if todosiguales(n):   
      print("El numero " + str(n) + " tiene los digitos iguales \n")
   else:   
      print("El numero " + str(n) + " NO tiene los digitos iguales \n")

test_todosiguales(2323)
test_todosiguales(2222)
test_todosiguales(1)
test_todosiguales(0)
test_todosiguales(4)
test_todosiguales(41)
test_todosiguales(10)
test_todosiguales(200)
test_todosiguales(88888888888888888)
test_todosiguales(101)
test_todosiguales(121)
test_todosiguales(212)
test_todosiguales(111111)
0
ответ дан 24.11.2019, 12:38
  • 1
    Serí в хороший, что те, кто голосуют для внизу, побеспокоятся о том, чтобы комментировать мотивы. Он делает má s 7 añ вы, которые достигли в SO и (между этой и другим опытом) уже я склонен заканчивать, что это сообщество в особенности не стоит усилия. – leonbloy 02.12.2016, 14:48

Так:

Matemáticamente ты можешь разлагать цифры числа разделяя это между Вашим основанием, как мы используем десятичную систему, а именно в основании 10 тогда чтобы переходить с одного сайта на другой в Ваших цифрах просто, мы это разделяем между 10.

Например: номера 3423

3423 % 10 = 3

3423 / / 10 = 342

342 % 10 = 2

342 / / 10 = 34

34 % 10 = 4

34 / / 10 = 3

3 % 10 = 3

3 / / 10 = 0

идея состояла бы в том, чтобы сохранять просто первую цифру, удаленную в переменной и потом сравнивать это с оставшейся частью цифр, если какой-либо бьет козырем "zas" не все цифры, они равны, если он удается до того, чтобы заканчивать со всеми цифрами "eureka" все цифры, - равны.

def digitos_iguales(n):
    n = abs(int(n))
    d = n % 10
    while n > 9:
        n = n // 10
        if d != n % 10:
            return False;
    return True

Эдж:

>>> var = "999999"
>>> digitos_iguales(int(var))
True
>>> var = "2222220"
>>> digitos_iguales(int(var))
False
-1
ответ дан 24.11.2019, 12:38

Мое зернышко песка, но в javaScript, asГ - видит результат:
MГ©todo простой сравнивая dГ-gito несовершеннолетний с оставшейся частью до тех пор, пока он не находит один отличным или остается без dГ-gitos, чтобы сравнивать.

for (var i=0; i<10000; i++)
	document.write (i,":",tieneTodosLosDigitosIguales(i),", ");

function tieneTodosLosDigitosIguales(numero){
	var digitosSonIguales=true; // 1 digito ( 0 incluido) = true
	var digitoAcomparar=digitoMenor(numero);
	var numeroRestante=Math.floor(numero/10);
	while(digitosSonIguales && numeroDigitos(numeroRestante)>0){
		digitosSonIguales = digitoAcomparar==digitoMenor(numeroRestante);
		numeroRestante = Math.floor(numeroRestante/10);
	}
	return digitosSonIguales;
}

function digitoMenor(numero){
	return numero%10;
}

function numeroDigitos(numero){
	var contadorDigitos=0; //0 = 0 digitos
	while (numero) {
		contadorDigitos++;
		numero=Math.floor(numero/10);
	}
	return contadorDigitos;
}
-2
ответ дан 24.11.2019, 12:38