2009-08-20 10 views
6

現在、私はAdaを教えていますが、私は始めるために従来のいくつかの問題に取り組むことができます。Adaの任意の長さ整数

具体的には、n> 100であるのに対して、階乗n!を計算しようとします。私の実装では、これまでされています。問題は、それさえLong_Long_Integerが、このためには小さすぎることで、n> 20のためのCONTRAINT_ERROR例外をスロー明らかである

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; 

任意の整数を実装するパッケージはありますか?

ありがとうございます!

PS:私はこの演習でループを探索したいので、再帰を選択しませんでした。しかし、そうでない場合は、コードの全側面(スタイル、ベストプラクティス、エラー..)にコメントしてください。

答えて

8

Ada Cryptoライブラリは大きな符号なしの数字(Big_Numbers)をサポートしています。 のlibをhttp://sourceforge.net/projects/libadacrypt-dev/からダウンロードできます。 私はsvnをチェックアウトすることをお勧めします。現在のリリースのBig_Numbers乗算関数 にはマイナーなバグがあります。

libを現在のGNATコンパイラthe AdaCore Libre siteからコンパイルできます。

a bug in gccのため、libはgcc-4.3またはgcc-4.4でコンパイルされません。

最後に、LibAdaCryptから2つの512ビットBig_Numbers を乗算する方法を説明します。私が集めたものから

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; 
 
Best regards 
    Christian 
+0

ありがとう!それは私が得ることを望んでいたよりもはるかに多くの答えです。私はそれをチェックします。 – Arne

+0

良い答え、キリスト教徒。私は先に進み、あなたの余分なウェブページを確認し、それらをあなたのためのリンクに変えました。うまくいけば、私のupvoteから余分な10ポイントは、より早く信頼できないnoob土地のあなたを推進するのに役立ちます。 –

1

、すべてのエイダのコンパイラは、組み込みの任意の長さの算術演算が付属しています。言語に定義されている方法で名前付き数字(型のない数値定数)をサポートする必要があります。

このように、標準を恥知らず、ユーザーにその施設への標準アクセスを提供していませんでした。次に、コンパイラが必要とするものに対しても使用可能であり、一般的な使用には2つの異なることがあります。

関連する問題