Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2018 09:35:40

EugeneK
Зарегистрирован: 2018-12-28
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

Всем привет. Я начал изучать python. Походу изучения на разных задачах наткнулся на одну и на ней застрял. Так сказать пока у самого мало опыта прошу помочь более опытных “питоноводов”.
Условия задачи.
# Пользователь вводит первое число от 1 до 999 999, потом вводит второе число в этом же диапазоне.
# Нужно выяснить содержит ли первое число все цифры из второго числа. Если “нет” вывести, что не содержит.
# Если содержит то вывести их позиции.
# Например:
# Первое 765 432
# Второе 25
#
# Вывод на экран
# цифра 2 позиция 1
# цифра 5 позиция 4
————————–
Вот мой код:

 first_num = input('input first number:')
length_f_of_num = len(first_num)
first_num = int(first_num)
#
second_num = input('input second number:')
length_s_of_num = len(second_num)
second_num = int(second_num)
#
for s_num in range(1, length_s_of_num+1):
    #
    remainder_of_2_div = second_num % 10
    div_zero_2 = second_num // 10
    second_num = div_zero_2
    for f_num in range(1, length_f_of_num+1):
        #
        remainder_of_1_div = first_num % 10
        div_zero_1 = first_num // 10
        first_num = div_zero_1
        #
        if remainder_of_2_div == remainder_of_1_div:
            print(f'Number {remainder_of_1_div} located on {f_num} position')

Я застрял на том, что после перебора и сравнения перовой цифры со второго числа А меня берется вторая цифра и сравнивать уже не с чем так как я не знаю как заново передать 1 число во 2 цикл чтоб начать заново делать делении с остатком, а потом без, и соответсв. запись изменившегося числа. Надеюсь понятно описал.
пример вывода на готово числе:

input first number:565432
input second number:25
Number 5 located on 4 position
Number 5 located on 6 position


Отредактировано EugeneK (Дек. 28, 2018 09:42:00)

Офлайн

#2 Дек. 28, 2018 09:55:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9729
Репутация: +  843  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

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

  
>>> def split_number(number):
...     out = []
...     if number == 0:
...         out.append(0)
...     while number:
...         out.insert(0, number % 10)
...         number //= 10
...     return out
... 
>>> split_number(12345)
[1, 2, 3, 4, 5]
>>> 
>>> split_number(0)
[0]
>>> split_number(12345012345)
[1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
>>



Офлайн

#3 Дек. 28, 2018 10:00:54

EugeneK
Зарегистрирован: 2018-12-28
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

А вариант возможен не спилтовать и не добавлять эти числа в список. Как-то заново передать 1 число НО не дробленное в 2 цикл.

Офлайн

#4 Дек. 28, 2018 10:28:44

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

EugeneK
Я застрял на том, что после перебора и сравнения перовой цифры со второго числа А меня берется вторая цифра и сравнивать уже не с чем так как я не знаю как заново передать 1 число во 2 цикл чтоб начать заново делать делении с остатком, а потом без, и соответсв. запись изменившегося числа. Надеюсь понятно описал.
EugeneK описали не то чтобы совсем понятно, а совсем непонятно, у меня когнитивный диссонанс потому что :
py.user.next
# Например:
# Первое 765 432
# Второе 25
#
# Вывод на экран
# цифра 2 позиция 1
# цифра 5 позиция 4
Цифра 2 имеет позицию 5 а цифра 5 позицию 2, в вашем же примере почемуто 1 и 4? WTF? или вы считаете справа налево?

у меня вопрос зачем вы вчисляете длинну чисел, зачем делите чтото на чтото? зачем вы переводите в int? работайте со строками же.
вот класический пример с вложеными циклами:

 first_num = input('input first number:')
second_num = input('input second number:')
for s_num in second_num:  # перебираем посимвольно second_num
    find_flag = False
    for i, f_num in enumerate(first_num[::-1]): # перебираем first_num
        if s_num == f_num: # если совпадает
            print('num {} position {}'.format(s_num, i+1)) # выводим индекс
            find_flag = True
    if not find_flag:  # если нет ни одного совпадения
        print('num {} not present in  {}'.format(s_num, first_num))



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 28, 2018 10:49:36)

Офлайн

#5 Дек. 28, 2018 10:54:02

EugeneK
Зарегистрирован: 2018-12-28
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

PEHDOM
# Например:
# Первое 765 432
# Второе 25
#
# Вывод на экран
# цифра 2 позиция 1
# цифра 5 позиция 4
Чего у меня в примере “2” стоит на 1 позиции так как я беру остаток от деление числа на 10( 765 432 % 10) и тоже самое с “5”, только после перезаписывая основного числа.
А вот за примеры со строкой большое спасибо. Так как опыта работы со строкой не имею. Буду пробовать по вашим примера.

Так все же возможно эту задачу сделать без строк и сплитов. Или это очень муторно получается?

Отредактировано EugeneK (Дек. 28, 2018 10:55:31)

Офлайн

#6 Дек. 28, 2018 11:29:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9729
Репутация: +  843  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

EugeneK
А вариант возможен не спилтовать и не добавлять эти числа в список.
Надо через список делать. Всё вместе делать не принято. Код должен быть простым. А чтобы код был простым, когда он сложный, надо его на части раскладывать. Поэтому разложение числа на цифры ложится на один участок кода, а сравнение множеств цифр ложится на другой участок кода. Так получается два простых участка кода, а не один сложный.



Отредактировано py.user.next (Дек. 28, 2018 11:30:30)

Офлайн

#7 Дек. 28, 2018 13:12:57

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

EugeneK
Так все же возможно эту задачу сделать без строк и сплитов. Или это очень муторно получается?
не то чтобы муторно, просто много лишних математических операций приходиться делать. А так все делается ровно также как и со строками, только с числами.
 def num_len(num):
    '''
       Определяем колличество цифр в числе без использования строк
    '''
    count = 1
    num //= 10
    while num >0:
        num //= 10
        count += 1
    return count
def get_dig(ind, num):
    '''
       Получить цифру стоящую в разряде ind числа num, без использования строк
    '''
    i = 1
    while i < ind:
        num //= 10
        i += 1
    return num % 10
first_num = int(input('input first number:'))
second_num = int(input('input second number:'))
for s_ind in range(1, num_len(second_num)+1): # перебираем second_num
    find_flag = False
    s_dig = get_dig(s_ind, second_num) # получаем число стоящее в s_ind разряде
    for f_ind in range(1, num_len(first_num)+1): # перебираем first_num
        f_dig = get_dig(f_ind, first_num) # получаем число стоящее в f_ind разряде
        if s_dig == f_dig: # если совпадает
            print('num {} position {}'.format(s_dig, f_ind)) 
            find_flag = True
    if not find_flag:
        print('num {} not present in  {}'.format(s_dig, first_num))



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 28, 2018 13:19:03)

Офлайн

#8 Дек. 28, 2018 17:17:10

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

Если именно решать задачу (получить результат), то я бы написал так:

 a = 765432
b = 250
for c in str(b):
	i = str(a).find(c)
	if i == -1:
		print('Цифра {}: отсутствует'.format(c))
	else:
		# считаем слева направо:
		print('Цифра {}: позиция {}'.format(c,i+1))
		# считаем справа налево:
		#print('Цифра {}: позиция {}'.format(c,len(str(a))-i))
Если ограничивать себя (без строк и тд), то зависит от того, насколько сильно ограничивать.

Офлайн

#9 Янв. 12, 2019 16:50:51

EugeneK
Зарегистрирован: 2018-12-28
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

Спасибо всем за помощь. Решил вот так

 first_num = input('input first number:')
if first_num.isnumeric():
    length_f_of_num = len(first_num)
    if length_f_of_num >= 1 and length_f_of_num <= 6:
        first_num = int(first_num)
        temp_num = first_num
        #
        second_num = input('input second number:')
        if second_num.isnumeric():
            length_s_of_num = len(second_num)
            if length_s_of_num >=1 and length_s_of_num <=6:
                second_num = int(second_num)
                #
                for s_num in range(1, length_s_of_num+1):
                    #
                    remainder_of_2_div = second_num % 10
                    div_zero_2 = second_num // 10
                    second_num = div_zero_2
                    #
                    for f_num in range(1, length_f_of_num+1):
                        #
                        remainder_of_1_div = first_num % 10
                        div_zero_1 = first_num // 10
                        first_num = div_zero_1
                        #
                        if remainder_of_2_div == remainder_of_1_div:
                            print(f'Number {remainder_of_1_div} located on {f_num} position')
                        elif div_zero_1 == 0:
                            first_num = temp_num
            else:
                print('You can input digital from  1 to 999 999')
        else:
            print('Second field accept only digital')
    else:
        print('You can input digital from 1 to 999 999')
else:
    print('First field accept only digital')

Офлайн

#10 Янв. 13, 2019 21:37:37

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Вопрос по задачке с 2-и циклами

EugeneK
Решил вот так

1. Это должно работать?
 print(f'Number {remainder_of_1_div} located on {f_num} position')

допустим, там
 print('Number {} located on {} position'.format(remainder_of_1_div, f_num))

2. Проверяем алгоритм:

input first number:123
input second number:321
Number 1 located on 3 position
Number 2 located on 3 position
Number 3 located on 2 position

3. “Без строк” же вроде?
 length_f_of_num = len(first_num)
А тут количество цифр в числе вычисляется с помощью строки.

4. Где реализация “Если “нет” вывести, что не содержит.”?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version