Произведение отличных от нуля чисел
Напишите программу, которая считывает 10 чисел и выводит произведение отличных от нуля чисел.
Формат входных данных: На вход программе подаются 10 целых чисел, каждое на отдельной строке.
Формат выходных данных: Программа должна вывести произведение отличных от нуля чисел.
Примечание: Гарантируется, что хотя бы одно из 10 чисел является ненулевым.
Sample Input 1:
8
0
1
2
1
0
0
5
4
12
Sample Output 1:
3840
Мой код:
total = 1
a = int(input())
for i in range(1, 10):
if a != 0 and a *= a:
a += a
print(total)
Ответы (6 шт):
считывать надо в теле цикла! И вам надо умножать переменную-счетчик на a (в случае, если условие в if выполняется). Прибавлять единицу к счетчику не надо. Мы же не количество считаем...
вот немного изменённая версия вашего кода:
total = 1
for i in range(10):
a = int(input())
if a != 0:
total *= a
print(total)
если ввод должен быть в одной строке, то так:
total = 1
for a in map(int, input().split()):
if a != 0:
total *= a
print(total)
также можно попробовать так:
total = 1
for a in map(int, input().split()):
total *= a or 1
print(total)
Формат входных данных На вход программе подаются 10 целых чисел, каждое на отдельной строке.
однако вы приводите пример
Sample Input 1:
8 0 1 2 1 0 0 5 4 12
т.е. ввод всех чисел в одной строке
так как именно надо ввести то?
касательно вашего кода - перед тем как задавать вопрос вы бы сами прошлись по нему и ответили на вопрос - а что делает каждая строчка вашего кода
total = 1
a = int(input()) # ввели одно число
for i in range(1, 10): # в цикле непонятно что сделали
if a != 0 and a *= a: # что это за условие?
a += a
print(total)
если уж на то пошло (в связи с новым годом)
res = 1
for num in map(int, input().split()):
if num != 0:
res *= num
можно и в одну строчку, но придется библиотеку тащить:
import functools
res = functools.reduce(lambda res, num: num * res, [i for i in map(int, input().split()) if i != 0])
result = 1
for _ in range(10):
a = int(input())
if a:
result *= a
print(result)
Oneliner
Читаем целые из входного потока по одному на строку. stdin притворяется iterable, который выдаёт строки по одной. map превращает строки в числа применяя int:
g1 = map(int, stdin)
Отбрасываем нули. Круглые скобки - генератор:
g2 = (v for v in g1 if v != 0)
reduce - классика функционального программирования: берёт функцию с двумя аргументами и последовательно применяет её к элементам и промежуточному итогу. mul - произведение двух чисел. 1 - начальное значение.
p = reduce(mul, g2, 1)
[1, 2, 3, 4] <промежуточный итог> * <число из списка> -> <новый промежуточный итог> 1 * 1 -> 1 1 * 2 -> 2 2 * 3 -> 6 6 * 4 -> 24
Результат печатаем:
print(p)
Всё вместе:
from functools import reduce
from operator import mul
from sys import stdin
print(reduce(mul, (v for v in map(int, stdin) if v != 0), 1))
$ python product.py 8 0 1 2 1 0 0 5 4 12 Ctrl+D 3840
Если число n подаваемое на вход равно нулю, то в скобках при верном равенстве будет значение True==1, в таком случае имеющее произведение домножается не на 0, а на 0 + 1. Если же число n подаваемое на вход не равно нулю, то в скобках значение False==0, следовательно произведение домножается на n + 0.
total = 1
for _ in range(10):
n = int(input())
total *= n + (n == 0)
print(total)