ロコリンの雑記

アニメ大好き会社員のロコリンのブログ。2015年卒(修士)の社会人。学生時代(2010年)から続けてるブログなのでエントリによっては学生ブログと社会人ブログになっています。時系列から察して。
 
 
このブログについて
ブログ内検索
カテゴリ
プロフィール

ロコリン

Author:ロコリン
2017年4月から会社員。2015年3月まで大学院生でした。
趣味:アニメ/Twitter/ゲーム/ニコ動
今(2015年2月更新):プリキュア/プリパラ/アイカツ/ごちうさ/艦これ

外部リンク
Twitter

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] 多倍長整数 System.Numerics.BigInteger を使ってみた 

C# の多倍長整数 (System.Numerics.BigInteger) を使ってみました。これを使うには参照設定に System.Numerics.dll を追加する必要があります。(IDE を使う場合はプロジェクト名を右クリックして参照設定を選びます。csc.exe コマンドで直接コンパイルする場合は /r:System.Numerics.dll オプションを指定します。)

Program.cs

using System;
using System.Numerics;

namespace BigIntegerTest
{
    class Program
    {
        /// <summary>
        /// 引数 n の階乗 n! を計算します。
        /// </summary>
        /// <param name="n">自然数 n</param>
        /// <returns>n の階乗</returns>
        public static BigInteger Factorial(BigInteger n)
        {
            if (n < 0)
            {
                throw new ArgumentOutOfRangeException();
            }
            BigInteger y = 1;
            for (var i = n; i > 0; --i)
            {
                y *= i;
            }
            return y;
        }

        /// <summary>
        /// フィボナッチ数列の第 n 項 (n は引数) を計算します。
        /// </summary>
        /// <param name="n">整数 n</param>
        /// <returns>フィボナッチ数列の第 n 項</returns>
        public static BigInteger Fibonacci(BigInteger n)
        {
            BigInteger x = 0, y = 1, a = 1, b = 0, t, sg = 1;
            if (n < 0)
            {
                n *= -1;
                if (n % 2 == 0) { sg = -1; }
            }
            for (;;)
            {
                if (n % 2 != 0)
                {
                    t = a;
                    a = a * x + b * y;
                    b = t * y + b * (x + y);
                }
                n /= 2;
                if (n < 1) { return sg * b; }
                t = x;
                x = x * x + y * y;
                y = t * y + y * (t + y);
            }
        }

        static void Main(string[] args)
        {
            try
            {
                Console.Write("n = ");
                var n = BigInteger.Parse(Console.ReadLine());
                var factN = Factorial(n);
                var fibN = Fibonacci(n);
                Console.WriteLine(String.Format("n! = {0}", factN));
                Console.WriteLine(String.Format("fib(n) = {0}", fibN));
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(String.Format("Error ({0}): {1}\n{2}", e.Source, e.Message, e.StackTrace));
            }
        }
    }
}

実行例

n = 50
n! = 30414093201713378043612608166064768844377641568960512000000000000
fib(n) = 12586269025

参考文献

スポンサーサイト
コメント















 管理者にだけ表示を許可する

トラックバック
 
http://rexpit.blog29.fc2.com/tb.php/88-cc74d8b3
最新記事
最新コメント
FC2カウンタ
やりたいゲーム

艦これはやってる

神姫PROJECT かんぱに☆ガールズ オンラインゲーム ロードオブワルキューレ オンラインゲーム
欲しい
最近買ったもの
Amazon 検索
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。