计算阶乘数
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 的角度来看,您的程序看起来还不错。
我正在自学 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 的角度来看,您的程序看起来还不错。