计算阶乘数

Calculating factorial numbers

我正在自学 Ada 编程语言,在我使用的教科书中有一个 练习打印出用户输入的数字的阶乘值。我的程序编译并执行 运行 正常,我确实得到了预期的输出,但如果我输入值 13,程序就会崩溃并引发错误。

我不知道为什么数字 13 会这样。 IDE 是否有错误(我使用 GNAT Studio)并且我目前使用 Ada 2012 标准。这是我的代码:

with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

-- procedure main - begins the program
procedure main is
   counter : Integer := 1;
   number : Integer := 0;
   factorial : Integer := 1;
begin
   New_Line;
   
   while counter <= 5 loop
      Put("Enter an integer: ");
      Get(number);
      
      for Count in 1 .. number loop
         factorial := factorial * Count;
      end loop;
      
      Put_Line("Factorial value is: " & integer'image(factorial));
      factorial := 1;
      
      counter := counter + 1;
   end loop;
   
   New_Line;
end main; -- end procedure main

错误信息是这样的:raised CONSTRAINT_ERROR : main.adb:35 overflow check failed [2021-04-11 13:25:10] 进程以状态 1 退出,经过时间:02.07s

这似乎是一个小问题,但我只想知道是否有问题 使用创建此代码的代码,或者它只是我使用的软件的一般错误。

提前致谢。

12 的阶乘为 479,001,600。乘以 13 得到 13 的阶乘,结果为 6,227,020,800 大于 32 位二进制数。

所以 Constraint_Error 告诉您 Integer 类型不能表示 13 的阶乘——计算溢出。如果要计算更大的阶乘,则必须使用“更宽”的整数类型。请注意,Integer 的宽度是特定于编译器的,但保证至少为 16 位。其他一些编译器可能使用 64 位整数。对 Ada 的一般建议是根据您的需要定义您自己的整数类型(类型 XX 的范围为 0 .. 83838 或其他)。

否则,从 Ada 的角度来看,您的程序看起来还不错。