2017-10-04 10 views
-2

私は関数のためにいくつかの数学を助けるために小さな階乗関数を作っています。"22!"で間違った結果を返す再帰的階乗関数

#include<iostream> 
using std::cout; 
using std::endl; 
class HandsShaking{ 
    private: 
    unsigned long long fac(int n){ 
     return fac(n, 1); 
    } 

    unsigned long long fac(unsigned long long n, unsigned long long ret){ 
     if(n == 1){ 
      return ret; 
     }else{ 
      return fac(n-1, ret*n); 
     } 
    } 

    public: 
    unsigned long long countPerfect(unsigned long long n){ 
     unsigned long long m = n/2; 
     cout<<fac(n)<<endl; 
     cout<<(fac(m+1)*fac(m))<<endl; 
     return fac(n)/(fac(m+1)*fac(m)); 
    } 
}; 

私はテール再帰的および符号なしロングロングをどこでも使用しているので、オーバーフローしていると疑っています。

申し訳ありませんが、私は、関数と定義を分離していないが、私の提出(数完璧な機能は)一つのファイルを指定します。

機能は、22までのすべての数字のために働くようだと後のすべての数字のために失敗しました。

ありがとうございました。

+0

'unsigned long型long'の範囲は何ですか?または 'std :: numeric_limit :: max()'? [システム上でオーバーフローする可能性があります。](https://www.google.co.in/search?client=ubuntu&hs=1vJ&q=22%21+-+2%5E64&oq=22%21+-+2%5E64&gs_l= psy-ab.3 ... 4086.7647.0.7933.8.8.0.0.0.0.398.1180.3-3.0.0.0.0.398.1180.3-3.3.0 .... 0 ... 1.1.64.psy-ab.5.3.1179 ... 0i8i30k1j0i8i7i10i30k1j0i7i5i10i30k1j0i8i10i30k1j0i8i7i30k1j35i39k1j0i67k1j0i7i30k1。 0.DBc-1gYjm74)。同様の質問:https://stackoverflow.com/questions/236335/when-i-calculate-a-large-factorial-why-do-i-get-a-negative-number –

+1

22! 264より大きい。 'unsigned long long'がシステム上で128ビット(またはそれ以上)でない限り(これはほとんど起こりそうにありません)、あなたの計算はあふれています。 – Cornstalks

+0

その64ビット1.8 * 10^19は22を置く!範囲外です。私はまだ50に働くためにfacが必要な問題です!そして私はどんなより大きい数の種類も知らない。 –

答えて

0

あなたは、このようなタスクのためBoost.Multiprecisionを使用することができます。

#include <iostream> 

#include <boost/multiprecision/cpp_int.hpp> 

using boost::multiprecision::cpp_int; 

cpp_int factorial(cpp_int x) 
{ 
    if (x == cpp_int{1}) return cpp_int{1}; 
    return x*factorial(x-1); 
} 

int main() 
{ 
    cpp_int n{22}; 
    std::cout << factorial(n) << '\n'; 
} 

Live example