2017-02-15 5 views
0
Scanner num=new Scanner(System.in); 
    System.out.println("Enter number in range from 1 to 20"); 
    int n=num.nextInt(); 
    int product=1; 
    for(int i=1;i<=n;i++){ 
     product*=i; 
     if(product>Integer.MAX_VALUE || product<Integer.MIN_VALUE){ 
     System.err.println("Out od Integer boundary"); 
     } 
     else System.out.println("Product of numbers between 1 and "+n+" is "+product); 
     } 

     } 
     }  

에 정수를 홍보에서 자바를 중지 프로그램을 만드는 것입니다 13 및 1에서 14까지. 얻은 제품을 기록하고 결과가 올바른지 결정하십시오. 다음 힌트 : 1 - 13의 제품 (= 6227020800)은 int [-2147483648, 2147483647]의 범위를 벗어나지 만 long 범위 내에 있습니다. 모든 것이 정확하다고해도 컴퓨터 프로그램이 정답을 산출하지 못할 수도 있습니다! 그래서 올바른 Java가 자동으로 int 값을 long 값으로 초월 할 것이지만 이해할 수 있으면 허용하지 않는 프로그램을 만들려고합니다. 가능합니까? 또한 코드 나 생각에 잘못된 것을 설명해주십시오. 감사합니다. p.s 나쁜 영어로 죄송합니다.은 가능 내가 같은 기본 작업이 특정 일에 일하고 있어요 긴

+3

아니요, Java는 마술처럼'int'를'long'으로 바꾸지는 않습니다. 단지'int'를 오버플로 할뿐입니다. – azurefrog

+1

'int product = 1;'을'long product = 1;'로 변경하면 오류가 발생합니다. 첫 번째 것도 어길 수 있습니다. –

+0

http://stackoverflow.com/a/1657868/655424 어디에서 오버플로가 발생하는지 감지하는 데 도움이됩니다.이 질문은 그 하나의 복제물에 가깝습니다. – Atreys

답변

0

것은, 단순한 솔루션은 자바 8)에 출연 Math.multiplyExact을 (사용하는 것입니다 :

,
import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Scanner num = new Scanner(System.in); 
     System.out.println("Enter number in range from 1 to 20"); 
     int n = num.nextInt(); 
     int product = 1; 
     try { 
      for (int i = 1; i <= n; i++) { 
       product = Math.multiplyExact(product, i); 
      } 
      System.out.println("Product of numbers between 1 and " + n + " is " + product); 
     } catch (ArithmeticException e) { 
      System.err.println("Out of Integer boundary"); 
     } 
    } 
} 

multiplyExact 방법을 사용하면 곱셈 결과가 오버플로되지 않도록 할 수 있습니다. 이 경우 AriphmeticException이 발생하여 캐치되어 처리 될 수 있습니다.

+0

감사합니다. 나는 아직도 멍청한 녀석이다. 미안하다. 질문이 어리 석다. – Yurodivi

0

Java는 특정 상황에서만 intlong으로 자동 변환합니다. 특히 무언가가 long으로 선언되어 있고 int이라고 입력하면 프로그램이 유효하고 intlong (숫자 값은 동일 함)으로 변환됩니다. 예 :

int a = 100; 
long b = a; // legal 
int c; 
b = c; // legal 

public static void doSomethingWithLong(long x) { ... } 

int d = 100; 
doSomethingWithLong(d); // legal 

Java는 longint 당신이 long을 포함하는 연산 식 및 int이있는 경우이다 촉진하는 또 다른 경우 : 여기 b

long a = 10000000000L; 
int b = 3; 
long c = a + b; 

을 표현 내부 long로 승격됩니다 그래서 그것에 a + b을 추가 할 수 있습니다. 그러나 수치가 같기 때문에 승격 된 사실은 아마도 구현 자에게만 관련이 있습니다.

하지만 모든 것이 Java입니다. 변수 또는 매개 변수를 int으로 선언하면 너무 큰 값을 입력하려고하기 때문에 변수가 long으로 다시 선언되지 않습니다. 여전히 int입니다. 너무 큰 값을 계산하려고하면 랩되고 잘못된 대답을 얻게됩니다. .

는 "넓은"형식으로 변환 할 때이 자동 변환에만 작동

(PS 그것은 두 가지를 작동하지 않습니다

long a = 10; 
int b = a; // error 

이 오류가 비록 a의 가치 것 인에서 실제로 적합 .. 내가 제대로 질문을 이해한다면 int 자바가 자동으로 캐스팅이 제공되지 않을 경우 intlong을 변환하지 않습니다)

+0

알겠습니다. 나는 이해합니다. – Yurodivi

+0

'int'의 범위 밖에서'long' 형의 표현식을 가지고'int'라고 선언 된 변수에 할당하려고하면 어떤 일이 일어날 지 주목할 가치가 있습니다. – Kevin