Python

Проблема с кодом в Python

Только учусь программированию, по-этому код простой.
Суть кода: при вводе числа пользователем, добавляется надпись "программист/программиста/программистов" в зависимости от числа (1 программист, 2 программиста, 5 программистов, 211 программистов, 624 программиста).
Проблема кода: на выводе некоторые if-ы не считаются. К примеру, 1 программист - выводит правильно. 2-4 программиста - выводит правильно. Но уже далее, от 5 до 10, должно быть программистов, но выводится всё равно с окончанием "а". Начиная от 11 и до 999 (до такого числа должна работать программа) окончание "ов". Кто может, найдите ошибку, пожалуйста. Действительно не пойму, что не так.

Текст кода:
a = int(input())
b = str(a)
if len(b) == 3:
c = a % 100
if c == 11 or 12 or 13 or 14 or 15 or 16 or 17 or 18 or 19:
print(a,"программистов")
else:
c = a % 10
if c == 1:
print(a,"программист")
elif c == 0 or 5 or 6 or 7 or 8 or 9:
print(a,"программистов")
elif c == 2 or 3 or 4:
print(a,"программиста")
elif len(b) == 2:
c = a % 10
if c == 1:
print(a,"программист")
elif c == 2 or 3 or 4:
print(a,"программиста")
elif c == 0 or 5 or 6 or 7 or 8 or 9:
print(a,"программистов")
elif len(b) == 1:
if a == 1:
print(a,"программист")
elif a == 2 or 3 or 4:
print(a,"программиста")
elif a == 0 or 5 or 6 or 7 or 8 or 9:
print(a,"программистов")
Конструкция
c == 11 or 12 or 13 ...
делает совсем не то, что ты думаешь. Проверка на значение из набора делается так:
c in [11, 12, 13, 14, 15, 16, 17, 18, 19]

Всё намного проще. Сначала надо проверить, что кол-во десятков в числе равно 1. Если это так - выдать 'ов', если не так - выдать окончание в соответствии с кол-вом единиц в числе.
Причём это не зависит от того, сколько в числе сотен, тысяч миллионов и т. д.

Задача решается в 2 строчки:

a = int(input())
print(a, 'программист' + ['ов', '', 'а', 'а', 'а', 'ов', 'ов', 'ов', 'ов', 'ов'][0 if a // 10 % 10 == 1 else a % 10]);
Bordian Alexandru
Bordian Alexandru
64 524
Лучший ответ
Николай Подмогильный я учусь по курсу одному, там пока этот материал не проходили. нахожусь на этапе операторов, и там задали такую задачку, по-этому решаю таким методом.
c in [11, 12, 13, 14, 15, 16, 17, 18, 19] пока тоже не учил, но возьму во внимание. спасибо за ответ
Николай Подмогильный если что, уже понял свою ошибку по ответу от человека выше. однако, вам тоже благодарен за ответ
a = int(input())
answer = str(a)
if a == 1:
    answer = answer + ' программист';
elif a % 10 >= 2 and a % 10 <= 4:
    answer = answer + ' программиста';
else:
    answer = answer + ' программистов';
print(answer)

Как то так должно быть?

Но есть некоторые моменты, праильнее 212 программистов или программиста?) или 214

----------------------------------------
UPD:
Ты неправильно условия пишешь.
Правильнее было так: a == 0 or a == 5 or a == 6 и т. п...
Но можно проще: if a in (0, 5, 6, 7, 8, 9)
Дмитрий Бобро
Дмитрий Бобро
73 465
Николай Подмогильный по поводу ошибки с условием, спасибо, понял. такая ошибка под носом была, а я не замечал. по поводу 2 варианта, спасибо тоже. действительно полезно
993 программиста!!!! Был похожий вопрос про копейки на с++. 990 программистов, 992 программиста
ĐĐ
Đímá Đímõń
21 700
Đímá Đímõń как красиво и просто на с++
string Padej(int n)
{
static string res; string ends;

if (n>99) n= n%100;
if (n>=11&&n<=14) { return res= "Программистов"; }
n= n%10;
switch(n)
{
case 1: ends= ""; break;
case 2:
case 3:
case 4: ends= "a"; break;
case 5:
case 6:
case 7:
case 8:
case 9:
case 0: ends= "ов"; break;
}
return res= "Программист"+ends;
}
попробуй с отступами поиграться