Используйте приведенное ниже условие, которое проверяет наличие нецифровых символов и длину усеченного значения Installation
:
CASE
WHEN
(NOT TRIM(Installation) GLOB '*[^0-9]*') AND (LENGTH(TRIM(Installation)) > 0)
THEN CAST(TRIM(Installation) AS BIGINT)
END
Обратите внимание, что тип данных BIGINT
в SQLite на самом деле INTEGER
(целое число от 1 до 8 байт).
Не полное решение, но некоторые идеи. Можно использовать следующую формулу:
журнал (топор) = x*loga
log10 может легко быть оценен как количество цифр. log2 может легко быть оценен путем подсчета сдвигов вправо.
На основе вышеупомянутого Вы могли значительно сузить список. Для остающихся чисел необходимо было бы сделать полные вычисления. Математические функции позволяются в Euler проекта? Если да, было бы лучше использовать логарифмы.
Один возможный подход должен был бы использовать идентификационные данные логарифма (то есть, ab идентичен eb * ln a). На самом деле, ab идентичен baseb * logbase для всех оснований кроме 0 и 1.
Так как логарифм является монотонной функцией вместо топора, который Вы могли сравнить, x * регистрируются для нахождения максимума. Вы, возможно, должны были бы принять числовую точность во внимание, все же.
При сравнении экспоненты * журнал (основа) вместо base^exponent для каждой строки в файле работает на эту проблему, не принимая точность во внимание. Это - конечно, лучшее решение с математической точки зрения, но я просто хотел указать, что это не действительно необходимо.
Другое возможное решение состоит в том, чтобы разделиться, каждое число в файле некоторой константой (скажите 100,000) прежде, чем выполнить возведение в степень на теперь меньших числах. Так как Вы сравниваете все значения друг другу, масштабирование их всех вниз постоянным множителем не влияет на конечный результат.