[Java]1~N까지의 곱(데이터타입, BigInteger)

Posted by ITPangPang
2016.04.08 00:52 Java/Java 예제

[Java]1~N까지의 곱(데이터타입, BigInteger)


 

[문제] 키보드로부터 N을 입력받아 1~N까지의 곱을 구하시오(단, 0<N<9001)

 

더블클릭을 하시면 이미지를 수정할 수 있습니다


 

 

[해결과정]

해결 전에 각각의 정수, 실수의 데이터 타입에는 범위가 있습니다.


int 

-2147483648 ~ 2147483647

long

-9223372036854775808 ~ 9223372036854775807

double

 4.94E-324 ~ 1.79E+308

 

범위를 보니 딱 봐도 long으로는 어림도 없고 double은 잘 모르겠으니 한번 써보겠습니다.

public class Exam7 { public static void main(String args[]) { double i; double j=1; double k; Scanner sc = new Scanner(System.in); i = sc.nextInt(); for(k=1;k<=i;k++) { j = j*k; } System.out.println(j); } } 

 

N에 1000을 넣으니 Infinity라는 결과가 뜨며 원하는 결과를 얻지 못하였습니다

 

해결하기 전에 타입별로 1~?까지의 곱이 가능한지 알아봤습니다.

 


① Int

 

 

② long

 

 

③ double


 

 

한번 타입별로 돌려보니 아래와 같은 결과를 얻을 수 있었습니다.


1~N까지의 곱에서 결과값을 얻는 N의 최대값

 int

N = 16

 long

N =  25

 double

N =  170

 

double형으로도 위의 문제의 답을 얻을 수 없었습니다.

 

해결하기 위하여 BigInteger Class를 사용하겠습니다.

 

 

 

 

[해결답안]키보드로부터 N을 입력받아 1~N까지의 곱을 구하시오(단, 0<N<9001)

 



public class Exam7
{
    public static void main(String args[])
    {
        int j = 1;
        BigInteger bi = null;
        BigInteger bi2 = new BigInteger("1");
 
        System.out.println("키보드로 부터 N을 입력받아 1~N까지의 곱");
        System.out.println("---------------------------");
        System.out.println("N값을 입력하세요:");
        Scanner sc = new Scanner(System.in);
        
        try
        {
            j = sc.nextInt();
            
            if(j<1||j>9000)
            {
                System.out.println("N의 범위는 0<N<9001 입니다");
            }
            else
            {
                for(int i=1; i<=j; i++)
                {
                    bi = new BigInteger(String.valueOf(i));
                    bi2 = bi2.multiply(bi);
                }
                System.out.println("1~"+j+"까지 곱의 결과 : ");
                System.out.println(bi2);
            }
        }
        catch(Exception e)
        {
            System.out.println("1이상 9000이하 양의 정수만 입력해주세요");
        }
        finally 
        {
            sc.close();
        }
    }
}

 

위와 같이 BigInteger를 사용하면 범위를 신경쓰지 않고 결과물을 출력 할 수 있습니다.

 

 

 

위에서는 곱하기만 사용하였기 때문에  bi2.multiply(bi);만 사용하였지만

 

더하기, 빼기, 나누기, 나머지등도 add, subtract, divide, mod를 사용하여

 

나타낼 수 있습니다.

 

 

 

문제에 N의 값을 최대 9000으로 설정한 까닭은 저의 컴퓨터 사양때문인지

 

콘솔창의 최대출력문제 때문인지는 몰라도 9080이상은 결과가 뜨지 않더라구요..

 

 

저작자 표시 비영리 변경 금지
신고
이 댓글을 비밀 댓글로