#UVa:10323-Factorial! You Must be Kidding!!!

灆洢 2015-05-06 00:43:01

照題目算出n階是否落於範圍內、大於範圍或是小於範圍。但這題最雷的是會有負數的狀況,根據目前algorithmist的說法,若要算F(-1),就用F(0)/0去算;算F(-2),就用F(-1)/-1,以此類推去輸出Overflow或是Underflow。(照上例,F(-1)為正無限大,F(-2)多了個負號,所以變成負無限大)

C++(0.019)

/*******************************************************/
/* UVa 10323 Factorial! You Must be Kidding!!!         */
/* Author: Maplewing [at] knightzone.studio            */
/* Version: 2015/05/06                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
  const long long int UPPER_BOUND = 6227020800;
  const long long int LOWER_BOUND = 10000;
  long long int mem[10005] = { 1, 1 };

  int lower_n = -1, upper_n = -1;
  for( int i = 2 ; mem[i-1] <= UPPER_BOUND && i < 10000 ; ++i ){
    mem[i] = mem[i-1] * i;
    if( lower_n == -1 && mem[i] >= LOWER_BOUND ){
      lower_n = i;
    }

    if( upper_n == -1 && mem[i] > UPPER_BOUND ){
      upper_n = i-1;
      break;
    }
  }

  int n;
  while( scanf("%d", &n) != EOF ){
    if( n < 0 ){
      if( n % 2 == 0 ){
        printf("Underflow!\n");
      }
      else{
        printf("Overflow!\n");
      }
    }
    else if( n < lower_n ){
      printf("Underflow!\n");
    }
    else if( n > upper_n ){
      printf("Overflow!\n");
    }
    else{
      printf("%lld\n", mem[n]);
    }
  }


  return 0;
}

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料