2017-11-12 6 views
2

unsigned long long intを使用して、プログラムが階乗を計算できる最大値を決定する、適切なアルゴリズムをC言語で記述する方法はありますか?プログラムが符号なしlong longを使用して階乗を計算できる最大値を決定する方法はありますか?

私の例は正しく動作しません。 Linux/64bitとGCCを使って、65回の繰り返しができます。

#include <stdio.h> 

int main() { 
    unsigned long long int num, i; 
    unsigned long long int factorial = 1; 
    num = 1; 
    for (i = 1; i <= num; i++) { 
     factorial = factorial * i; 
     num++; 
     if (factorial <= 0) { 
      printf("\nMaximum number is: %d\n", i - 1); 
      break; 
     } 
    } 
} 

答えて

4

ので、あなたのプログラムが正しく動作しません:それはunsigned型を持っているので

  • factorialは常に>= 0です。プログラムが停止する唯一の理由は、0です。十分な時間を2倍または2の倍数に増やすと、最終的に0になります。
  • 結果値をテストすることで、オーバーフローを確実に検出することはできません。符号なし算術演算は、の値のビットが含まれているので、結果を前の階乗と比較し、小さい場合は中断することができます。ただし、符号付き算術オーバーフローには実際には未定義の動作があるため、結果が負になることのテストは常に間違っています。

より信頼性の高いアプローチは、乗算を実行する前に、オーバーフローをチェックしている:

#include <limits.h> 
#include <stdio.h> 

int main(void) { 
    unsigned long long int i, factorial; 
    for (i = factorial = 1; factorial <= ULLONG_MAX/i; i++) { 
     factorial = factorial * i; 
    } 
    printf("\nMaximum number is: %llu! = %llu\n", i - 1, factorial); 
    return 0; 
} 

出力:

Maximum number is: 20! = 2432902008176640000 
+0

@Eifel:あなたはその下のグレーのチェックマークをクリックして、この答えを受け入れることができますがスコア。 – chqrlie

関連する問題