我目前正在教自己Ada,虽然我可以从解决一些更传统的问题开始.
更具体地说,我尝试计算阶乘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;
Run Code Online (Sandbox Code Playgroud)
问题很明显,即使Long_Long_Integer可能太小,也会因为n> 20而抛出CONTRAINT_ERROR异常.
是否有一个实现任意大小的整数的包?
谢谢!
PS:我确实选择了反对递归,因为我想在这个练习中探索循环.但否则请评论代码的所有方面(样式,最佳实践,错误..)
小智 8
Ada Crypto Library支持大的无符号数字(Big_Numbers).您可以从http://sourceforge.net/projects/libadacrypt-dev/下载lib .我建议查看svn.当前版本的Big_Numbers乘法函数有一个小错误.
您可以使用AdaCore Libre站点中的当前GNAT编译器编译lib .
由于gcc中的错误, lib不会在gcc-4.3或gcc-4.4下编译.
最后,我将给你一个小例子,如何将两个512位Big_Numbers从LibAdaCrypt中相乘.
package Test.Big_Numbers is
with Crypto.Types.Big_Numbers;
pragma Elaborate_All(Crypto.Types.Big_Numbers);
package Big is new Crypto.Types.Big_Numbers(512);
use Big;
use Big.Utils;
end Test.Big_Numbers;
package body Test.Big_Numbers is
x : Big_Unsigned := To_Big_Unsigned("16#57C19F8F7866F8633AC1D25B92FC83B4#");
Y : Big_Unsigned := To_Big_Unsigned("16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60#");
x := X * Y;
Put_Line(X);
end Test.Big_Numbers;
Run Code Online (Sandbox Code Playgroud)
Best regards Christian
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |