Меня немного беспокоит ваша функция iswhole()
:
def iswhole(x):
if x%1 == 0:
return True
else:
return False
(Кстати, это можно переписать просто как return (x%1 == 0)
и пропустить фрагменты return True
и return False
.)
Числа с плавающей точкой - нечетные существа:
>>> 10.0%1
0.0
>>> (10.1 * 10)%1
0.0
>>> (10.01 * 100)%1
0.0
>>> (10.001 * 1000)%1
0.0
>>> (10.0001 * 10000)%1
0.0
>>> (10.00001 * 100000)%1
0.0
>>> (10.000001 * 1000000)%1
0.0
>>> (10.0000001 * 10000000)%1
0.0
>>> (10.00000001 * 100000000)%1
1.1920928955078125e-07
Для ввода, такого как 6
, это, похоже, не является проблемой, но может стать проблемой.для больших входов. Сравнение чисел с плавающей запятой проблематично .
Для проблемы 6
я хотел бы предложить, чтобы вместо изменяемого списка для отслеживания ваших данных вы могли бы использовать массив вместо.Массив никогда не нужно сортировать (тот факт, что в вашей программе есть sort()
, пахнет как попытка исправить какую-то ошибку) и удаление элементов из середин списков часто чрезвычайнодорого.(Это sort
в значительной степени означает, что ваша производительность все равно будет плохой. Не так уж и много для небольших входов, но попробуйте 1000000 в качестве отправной точки.) Установка элементов в массиве на 1
или 0
почти всегдагораздо дешевле, чем изменяемые списки.