首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算阶乘数

计算阶乘数
EN

Stack Overflow用户
提问于 2021-04-11 20:26:40
回答 1查看 136关注 0票数 4

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

我不知道为什么数字13会这样。IDE (我使用GNAT Studio)和我当前使用的Ada 2012标准有问题吗?下面是我的代码:

代码语言:javascript
运行
复制
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

这看起来是一个很小的问题,但我只是想知道是代码有问题,还是我使用的软件出现了普遍的bug。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-11 21:24:34

12的阶乘是479,001,600。乘以13得到13的阶乘,其值是6,227,020,800,它大于32位二进制数。

因此,Constraint_Error告诉您Integer类型不能表示13的阶乘--计算溢出。如果你想计算更大的阶乘,你必须使用“更宽”的整数类型。请注意,Integer的宽度是特定于编译器的,但保证至少为16位。其他一些编译器可能会使用64位整数。Ada的常规建议是定义您自己的整数类型(类型XX的范围为0 ..83838或更多),这取决于您需要什么。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67044964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档