桁数が非常に大きい数値の計算 - BigIntegerを利用したInt64を超える数値の計算 - C#
C#で非常に桁数の大きい数値の計算をするコードを紹介します。
概要
C#で非常に桁数の大きい数値(整数)の計算をする場合は、System.Numerics 名前空間の BigInteger クラスを利用します。
例1 : シンプルな演算
2つの非常に桁数の大きい数値の足し算をするプログラムのコードです。
UI
下図のUIを作成します。フォームにテキストボックスを3つ、ボタンを1つ配置します。
参照の追加
プロジェクトの作成状態では、System.Numerics アセンブリは参照に追加されていないため、参照に追加します。Visual Studioを起動し、ソリューションエクスプローラを表示します。プロジェクトのノードを開き、[参照]ノードを選択します。
参照ノードで右クリックしポップアップメニューを表示します。メニューの[参照の追加]を選択します。
[参照マネージャー]ダイアログが表示されます。左側のメニューで[アセンブリ]カテゴリ内の[フレームワーク]を選択します。下図の画面が表示されます。
右側のアセンブリ一覧から[System.Numerics]を探します。
[System.Numerics]アセンブリの項目の左側のチェックボックスにチェックをつけます。チェック後ダイアログ右下の[OK]ボタンをクリックします。
ソリューションエクスプローラの参照ノードを確認すると[System.Numerics]アセンブリが追加されています。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;
namespace SimpleCalc
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
BigInteger a = BigInteger.Parse(textBox1.Text);
BigInteger b = BigInteger.Parse(textBox2.Text);
BigInteger c = a + b;
textBox3.Text = c.ToString();
}
}
}
解説
テキストボックスからBigIntegerに値を代入する場合は、BigIntegerのParseメソッドを利用します。(ConvertクラスにはBigIntegerへの変換メソッドは用意されていません。)
演算は通常のintやlongと同様の書式で、記述できます。上記のコードは2つの値を加算します。
結果を文字列に変換する場合は、BigIntegerオブジェクトのToString()メソッドを利用します。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックス2つに桁数の大きい数値を入力します。
[button1]をクリックします。下部のテキストボックスに上部の数値2つを加算した結果が表示されます。
例2 : 階乗の計算
階乗を計算するコードを紹介します。
8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 40,320
8の階乗は上記の結果となります。
UI
下図のUIを作成します。
コード
下記のコードを記述します。また、先の手順でも紹介した System.Numerics アセンブリを参照に追加します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;
namespace FactorialDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int number = Convert.ToInt32(textBox1.Text);
BigInteger result=1;
for (int i = 1; i <= number; i++) {
result = result * i;
}
textBox2.Text = result.ToString();
}
}
}
解説
forループでの反復処理により、階乗を計算します。階乗の結果は非常に大きな数字になるため、BigIntegerを利用しています。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに"5"を入力して[button1]をクリックします。階乗の計算が実行され結果の"120"が下部のテキストボックスに表示されます。
"12"の階乗の結果です。
"168"の階乗の結果です。
"1000"の階乗の結果です。
"34851"の階乗の結果です。非常に大きな数値でも演算ができることが確認できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用