2016-09-30 10 views
1

sql2014では、4つの整数(W、X、Y、Z)とBを持つテーブルがあります。 B = C(X、Z)* C(WX; YZ)ここで、C(n、k)は、n個のオブジェクトから取られたk個のオブジェクトの組み合わせ、すなわち通常のn [k] 40となるので、最大のBは1.37847E + 11 です(ExcelのCOMBIN関数を使用して)正しい値を計算できますが、SQLでは同じ値にすることはできません。私は必要なW、X、Y、Zのすべての組み合わせでテーブルを生成できますが、大きな値のBを計算しようとすると、「40!」のようなものを扱う方法がわかりません。tsqlで大きなコンビナトリアル量を計算する方法

私は、階乗のpreinserted値でCTEを使用したいようなものでしょう:

;WITH factorials AS(
SELECT 2 as N, 2 AS F 
UNION ALL 
SELECT 3,6 
UNION ALL... 
) 

しかし、私は40を格納する方法を知りません!等が挙げられる。

.NETを使用して表を埋めることはオプションではないため、SQLで作成する必要があります。

私はCTEのようなテーブルを使って2〜3列に階乗を格納することを考えていましたが、最初の10億の格納、2番目の10億の格納など(INTを使用して) (Ax10^9 + B)/(Cx10^9 + D)のように、このように格納された数値の分割方法

bigintより大きい整数をtsqlで管理するにはどうすればよいですか?

+0

今、私は多項式の間に良い古い分裂を考えています...そして、それはほとんど些細なようです...しかし、そうではありません!おそらくあまりにも大きな数字を処理する必要があるのでおそらく –

答えて

1

私は、これは完全な解決策ではないと確信していますが、多分それはあなたを開始する方法についていくつかのアイデアを与えるだろう。おそらく、これをストアドプロシージャにして@nと@kを渡すことができます

DOUBLEを使用すると、BIGINTにキャストするときに問題が発生していないようです。おそらく、誰かがこれを行う明らかな危険性についてコメントすることができます。

DECLARE @final_value DOUBLE PRECISION 
DECLARE @n INT = 40 
DECLARE @k INT = 20 

;WITH CTE AS 
(
SELECT 1 AS num,CAST(1 AS DOUBLE PRECISION) AS factorial 
UNION ALL 
SELECT num+1,CAST(factorial*(num+1)AS DOUBLE PRECISION) FROM CTE 
WHERE CTE.num < 40 
) 

SELECT * INTO #temp_numbers FROM CTE 

SET @final_value = (SELECT factorial FROM #temp_numbers WHERE num = @n)/
    (SELECT factorial FROM #temp_numbers WHERE num = @k)/
    (SELECT factorial FROM #temp_numbers WHERE num = (@[email protected])) 

PRINT CAST(@final_value AS BIGINT) 
DROP TABLE #temp_numbers 
+0

これは私が必要としていたものです。私は今日あなたの答えを私のケースに当てるチャンスがあり、それは完璧かつ非常に速く働いています。どうも! –

関連する問題