Форум сайта python.su
Всем привет. Я начал изучать 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')
Отредактировано EugeneK (Дек. 28, 2018 09:42:00)
Офлайн
Сначала нужно оба числа разложить на цифры и получить два списка с цифрами, а потом уже с этими списками цифр работать.
>>> 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] >>
Офлайн
А вариант возможен не спилтовать и не добавлять эти числа в список. Как-то заново передать 1 число НО не дробленное в 2 цикл.
Офлайн
EugeneKEugeneK описали не то чтобы совсем понятно, а совсем непонятно, у меня когнитивный диссонанс потому что :
Я застрял на том, что после перебора и сравнения перовой цифры со второго числа А меня берется вторая цифра и сравнивать уже не с чем так как я не знаю как заново передать 1 число во 2 цикл чтоб начать заново делать делении с остатком, а потом без, и соответсв. запись изменившегося числа. Надеюсь понятно описал.
py.user.nextЦифра 2 имеет позицию 5 а цифра 5 позицию 2, в вашем же примере почемуто 1 и 4? WTF? или вы считаете справа налево?
# Например:
# Первое 765 432
# Второе 25
#
# Вывод на экран
# цифра 2 позиция 1
# цифра 5 позиция 4
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)
Офлайн
PEHDOM
# Например:
# Первое 765 432
# Второе 25
#
# Вывод на экран
# цифра 2 позиция 1
# цифра 5 позиция 4
Чего у меня в примере “2” стоит на 1 позиции так как я беру остаток от деление числа на 10( 765 432 % 10) и тоже самое с “5”, только после перезаписывая основного числа.
А вот за примеры со строкой большое спасибо. Так как опыта работы со строкой не имею. Буду пробовать по вашим примера.
Так все же возможно эту задачу сделать без строк и сплитов. Или это очень муторно получается?
Отредактировано EugeneK (Дек. 28, 2018 10:55:31)
Офлайн
EugeneKНадо через список делать. Всё вместе делать не принято. Код должен быть простым. А чтобы код был простым, когда он сложный, надо его на части раскладывать. Поэтому разложение числа на цифры ложится на один участок кода, а сравнение множеств цифр ложится на другой участок кода. Так получается два простых участка кода, а не один сложный.
А вариант возможен не спилтовать и не добавлять эти числа в список.
Отредактировано py.user.next (Дек. 28, 2018 11:30:30)
Офлайн
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)
Офлайн
Если именно решать задачу (получить результат), то я бы написал так:
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))
Офлайн
Спасибо всем за помощь. Решил вот так
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')
Офлайн
EugeneK
Решил вот так
print(f'Number {remainder_of_1_div} located on {f_num} position')
print('Number {} located on {} position'.format(remainder_of_1_div, f_num))
length_f_of_num = len(first_num)
Офлайн