Search Results for 'factorial'

1 POSTS

  1. 2008/03/11 BigInteger를 사용한 Factorial함수

BigInteger를 사용한 Factorial함수

Posted 2008/03/11 14:25
  웹 프로그래밍 시간에 '50!'를 구해서 화면에 뿌리라는 숙제가 나왔다. 너무 쉽다고 생각하고 단숨에 코딩을 하고 화면에 뿌려봤는데 Integer 그리고 Long의 범위를 벗어나는 overflow가 발생했다. 교수님의 의도는 단지 JSP로 함수를 정의하고 그 함수를 사용해보라는 의도셨는데 왠지모를 오기가 생겼다. 50!를 구해서 화면에 뿌려보고 싶었다. 예전에 BigInteger라는 클래스를 본적이 있는데 다행히 BigInteger라는 클래스를 사용해 해결할 수 있었다.

50!의 결과는 다음과 같다.
30414093201713378043612608166064768844377641568960512000000000000

호기심이 생겨서 1000!도 계산해 봤는데 계산이 된다.
4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048004799886
1019719605863166687299480855890132382966994459099742450408707375991882362772718873251977950595099527612087497
5462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323
9584630755574091142624174743493475534286465766116677973966688202912073791438537195882498081268678383745597317
4613608537953452422158659320192809087829730843139284440328123155861103697680135730421616874760967587134831202
5478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810
2130927612448963599287051149649754199093422215668325720808213331861168115536158365469840467089756029009505376
1647584772842188967964624494516076535340819890138544248798495995331910172335555660213945039973628075013783761
5307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892
1879602238389714760885062768629671466746975629112340824392081601537808898939645182632436716167621791689097799
1190375403127462228998800519544441428201218736174599264295658174662830295557029902432415318161721046583203678
6906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958
6526822728070757813918581788896522081643483448259932660433676601769996128318607883861502794659551311565520360
9398818061213855860030143569452722420634463179746059468257310379008402443243846565724501440282188525247093519
0620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814
9001407673104466402598994902222217659043399018860185665264850617997023561938970178600408118897299183110211712
2984590164192106888438712185564612496079872290851929681937238864261483965738229112312502418664935314397013742
8531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602
7898643211390835062170950025973898635542771967428222487575867657523442202075736305694988250879689281627538488
6339690995982628095612145099487170124451646126037902930912088908694202851064018215439945715680594187274899809
4254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105
9339838357779394109700277534720000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000


import java.math.BigInteger;
import java.util.Scanner;


public class BigIntegerTest {
        /**
         * BigInteger를 사용해서 factorial을 구한다.
         * @param num 구하고자하는 factorial숫자
         * @return factorial 결과값
         */
        public static BigInteger factorial(int num) {
                if(num == 1)
                        return BigInteger.valueOf(1);
                return BigInteger.valueOf(num).multiply(factorial(num - 1));
        }
       
        /**
         * 일반적인 방법으로 factorial을 구한다.
         * @param num 구하고자하는 factorial숫자
         * @return 구하고자하는 factorial숫자
         */
        public static long factorial(long num) {
                if(num == 1)
                        return 1;
                return num * factorial(num-1);
        }
       
        public static void main(String[] args) {
                Scanner in = new Scanner(System.in);
                System.out.println(factorial(in.nextInt()));
        }
}