2014-07-14 3 views
-3

projectEuler.net 웹 사이트의 문제 (no.6) 중 하나에서 n 개의 숫자 합계와 제곱 된 숫자 합계의 제곱의 차이를 찾아야합니다. 매우 쉽지만 입력이 매우 클 때 이것을 찾는 방법을 생각할 수 없습니다.계열 합계를 찾습니다

예 : n = 1000 일 때 나의 자바 프로그램이 나에게 이상한 대답을하고있다. 그래서, 누군가 이걸 없애는 방법을 도와 줄 수 있니?

내 코드를 제출하지 않아 죄송합니다. 하지만 내 코드에서 긴 데이터 형식을 사용했지만 여전히 오버플로가 발생했습니다.

package projectEuler; 
import java.util.Scanner; 
public class Problem6{ 
    public static void main(String args[]){ 
     Scanner input=new Scanner(System.in); 
     int t=input.nextInt(); 
     int n; 
     long a,b; 

     while(t-->0){ 
      n=input.nextInt(); 
      a=((n*n*(n+1)*(n+1))/4); 
      b=((n*(n+1)*(2*n+1))/6); 
      System.out.println("sigma n^3 is "+a); 
      System.out.println("sigma n^2 is "+b); 
      //diff=(((n*n*(n+1)*(n+1))/4)-((n*(n+1)*(2*n+1))/6)); 
      System.out.println((a-b)); 
     } 
    } 
} 
+5

오버플로가 발생했습니다. 'long'또는 'BigDecimal'을 사용하십시오. –

+0

코드가 표시되지 않지만 .... 정수가 오버플로됩니다 ..... –

답변

1

사용할 수 있습니다 및 b. 그렇지 않으면 식 (n*n*(n+1)*(n+1))/4이 오버플로되어 심지어 a에 할당됩니다. 이는 int * int이 곱셈 결과가 int에 할당하기에는 너무 큰 경우에도 항상 int 결과를 제공하기 때문입니다.

0

INT : 최대 값은 2,147,483,647

입니다 : 최대 값은 당신이 최대 정수 값을 도달하고 9,223,372,036854775807

그래서, 다음과 같이

내 코드입니다 오버플로 오류입니다.

int 대신 long을 사용하십시오.

더 많은 정보 : 귀하의 요구 사항이 어떤 원시 데이터 유형에 적합하지 않는 경우 Java Basic Data Types

관련 문제