BigInteger를 사용한 Factorial함수
Posted 2008/03/11 14:25
웹 프로그래밍 시간에 '50!'를 구해서 화면에 뿌리라는 숙제가 나왔다. 너무 쉽다고 생각하고 단숨에 코딩을 하고 화면에 뿌려봤는데 Integer 그리고 Long의 범위를 벗어나는 overflow가 발생했다. 교수님의 의도는 단지 JSP로 함수를 정의하고 그 함수를 사용해보라는 의도셨는데 왠지모를 오기가 생겼다. 50!를 구해서 화면에 뿌려보고 싶었다. 예전에 BigInteger라는 클래스를 본적이 있는데 다행히 BigInteger라는 클래스를 사용해 해결할 수 있었다.
50!의 결과는 다음과 같다.
호기심이 생겨서 1000!도 계산해 봤는데 계산이 된다.
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
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()));
}
}
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()));
}
}
'C.S.E > Java' 카테고리의 다른 글
| [Java How To Programming] 5.25 Diamond (0) | 2008/05/17 |
|---|---|
| Java에서 JavaScript호출하기 (0) | 2008/05/02 |
| BigInteger를 사용한 Factorial함수 (0) | 2008/03/11 |
| 자바(Java)의 장점과 단점 (0) | 2008/03/09 |
| 제 9회 한국 자바 개발자 컨퍼런스 이벤트에 참여하세요!! (2) | 2008/02/05 |
| 제 9회 자바 개발자 컨퍼런스 안내 (2) | 2008/01/22 |
- Filed under : C.S.E/Java
- Tag : BigInteger, factorial
- Comment Trackback
이올린에 북마크하기