Получилось выжать проверку до
за полторы минуты (на одном ядре).
До
за
секунды
Не, у меня всё сильно скромнее, порядка на два медленнее, до
не дождался, а до
проверяется около 7 минут:
{$APPTYPE CONSOLE}
uses SysUtils;
var f: array[0..7] of integer;//int32 mod 10^9
function Check(): boolean;
var i, d, x: integer;
begin
Result := false;
for i := 0 to High(f) do begin
x := f[i];
while x > 0 do begin
d := x mod 10; x := x div 10;
if d in [1, 2, 6] then exit;
end;
end;
Result := true;
end;
var n, i, c: integer;
m: int64;
begin
f[0] := 1; for i := 1 to High(f) do f[i] := 0;
for n := 2 to round(1e9) do begin
c := 0;
for i := 0 to High(f) do begin
m := f[i]; m := m * n + c; c := m div 1000000000; f[i] := m mod 1000000000;
end;
if f[0] = 0 then begin
for i := 1 to High(f) do f[i - 1] := f[i];
f[High(f)] := 0;
end;
if not Check() then continue;
Write(n, '!=..'); for i := High(f) downto 0 do Write(Format('%9.9u', [f[i]])); Writeln;
end;
end.
-- 26.08.2016, 03:01 --PphantommihaildДрузья, я невольно ввёл и Вас и себя в заблуждение словами
можно хранить лишь примерно 60 младших ненулевых цифр,
После обдумывания и написания теста это оказалось не совсем правдой.
При сдвиге результата умножения вправо надо уменьшать количество верных цифр (но можно не всегда), вот пример некорректности поведения для хранения 6-ти младших цифр:
, младшие 6 цифр (только они и хранимые в примере):
, пока было всё хорошо, но вот при вычислении следующего факториала беда:
, младшие 6 цифр:
, но
, т.е. не совпадает с точным значением факториала в старшей цифре.
Забавно, что следующие факториалы снова совпадают до
, у которого не совпадают уже две старшие цифры.
Только лишь увеличением количества цифр проблема не решается, лишь отодвигается, но на миллионных итерациях она всё равно встанет в полный рост.