В настоящее время я учу себя Аде, и хотя я мог бы начать с решения некоторых более традиционных проблем, чтобы начать.
Более конкретно, я пытаюсь вычислить факториал n !, тогда как n> 100. Моя реализация до сих пор:
with Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Text_IO;
procedure Factorial is
-- define a type covering the range beginning at 1 up to which faculty is to
-- be computed.
subtype Argument is Long_Long_Integer range 1..100;
-- define a type that is large enough to hold the result
subtype Result is Long_Long_Integer range 1..Long_Long_Integer'Last;
package Result_IO is new Ada.Text_IO.Integer_IO(Result); use Result_IO;
-- variable holding the faculty calculated.
fac : Result := 1;
begin
-- loop over whole range of ARGUMENT and calculate n!
for n in ARGUMENT loop
fac := (fac * n);
end loop;
end;
Проблема, очевидно, в том, что даже Long_Long_Integer может быть слишком мал для этого и выдает исключение CONTRAINT_ERROR для n> 20.
Существует ли пакет, который реализует целые числа произвольного размера?
Спасибо!
PS: я выбрал рекурсию, потому что я хотел исследовать циклы в этом упражнении. Но в противном случае, пожалуйста, прокомментируйте все аспекты кода (стиль, лучшие практики, ошибки ..)