计算阶乘数
我正在自学 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
错误消息是这样的:引发 CONSTRAINT_ERROR : main.adb:35 溢出检查失败 [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 的角度来看,您的程序看起来还不错。