2014-12-29 3 views
-2

U 헬싱키 자바 코스를 사용하고 있는데 윤년 문제가 생겼습니다.윤년이 유효하지 않습니다.

저는 if와 else로 연산자를 사용하고 있고 코드는 올바르게 보이지만 1700, 1500을 윤년으로 반환합니다. 이 예는 4 경우와 나누어 윤년한다고 그리고 그것은 경우 검사가 정확하지 않기 때문에 100

import java.util.Scanner; 

public class LeapYear { 

    public static void main(String[] args) { 
     Scanner reader = new Scanner(System.in); 

     System.out.println("Type a year: ");   
     int year = Integer.parseInt(reader.nextLine()); 

     if ((year % 4 == 0) || ((year % 100 == 0) && (year % 400 == 0))){ 
      System.out.println("The year is a leap year."); 
     } else { 
      System.out.println("The year is not a leap year."); 
     } 
    } 
} 
+2

@Reimeus * 그러나 1700, 1500을 윤년으로 * 반환합니다. 코드가 그러한 결과를 생성하지 않기 때문에 믿기 어렵지만, 개선 할 부분은 없습니다. 이 질문은 두 사이트 모두 주제가 될 수 있습니다. 질문이 더 명확 해지면 codereview와 여기. –

+1

'((연도 % 4 == 0) && (연도 % 100 == 0) && (연도 % 400 == 0)) {'또한 400으로 나눌 수있는 경우 100으로 자동 나눌 수 있습니다. , 그렇지 않니? – jbutler483

+0

코드가 작동하지 않으므로 CodeReview에는 적합하지 않습니다. 이 사이트는 디버깅이 아닌 이미 작동중인 코드를 개선하기위한 것입니다. – krillgar

답변

-2

1700 (400)는, 1500 윤년으로 반환하는 의해도 나눌 경우.

는 알고리즘에 대한 (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))

자세한 내용은 여기에서 찾을 수 있습니다 정확한 검사입니다 : Leap Year Algorithm

+0

나는 이것을 일찍 시도했다. 그것은 잘 작동하지 않습니다. 윤년으로 1500 및 1700 등을 반환합니다. – disengage

+0

끝 부분에')'를 추가하면 이것은 완전히 맞습니다. –

1

윤년의 규칙은 간단합니다 :

  • 년 4로 나눌 수 있어야합니다 아니라 100 또는
  • 년은 400으로 나눌 수 있어야합니다.

귀하는 &&||으로이를 수행하지 않습니다. 당신이 선발있어 이후로, 내가보기 엔 당신이 위해 코드에 라인을 분할하는 것이 좋습니다, 코드가

if ((year % 4 == 0 && year % 100 != 0)) 
    || (year % 400 == 0)) { 
    //rest of your code... 
} 

것 주석을 제거함으로써

if ((year % 4 == 0 && year % 100 != 0)) 
    //^year divisible by 4 and not by 100 
    || (year % 400 == 0) 
    //^year divisible by 400 
    ) { 
    //rest of your code... 
} 

:

그냥이 변경을 당신이 그것을 이해할 수 있도록. 당신은 더 많은 연습을 일단,이 같은 것을 쓰고 종료됩니다 :

static boolean isLeapYear(int year) { 
    return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); 
} 
0

을 당신은 당신의 '경우'문을 변경해야합니다 : 첫 번째 조건 경우 문 '이'현재에서

if(((year % 4 == 0) && (year % 100 !=0))||(year % 400 == 0)) 

을 진술이 참이면, &이 거짓이면 진술은 거짓이 될 것입니다. 두 번째 조건은 어떤 부분도 전혀 재생하지 않습니다.

2
boolean isLeapYear = false; 
if (year % 4 == 0) { 
    isLeapYear = true; 
} 
if (year % 100 == 0) { 
    isLeapYear = false; 
} 
if (year % 400 == 0) { 
    isLeapYear = true; 
} 
관련 문제