2014-11-30 2 views
1

나는 주어진 년에서 year > 1999이고 0에서 6까지의 값을 반환하는 함수를 만들려고합니다. 여기에서 Sunday = 0, Monday = 1 ... Saturday = 6은 11 월 1 일이 시작되는 요일과 일치합니다. 내가 11 월 1 일을 알고 있기 때문에 2000 년 3 월 (수요일) 나는 이것을 NOV1으로 사용한다. 내가 윤년을 염두에 두어야한다는 것을 알고 있으므로 if 성명서가 도움이 될 것입니다. 왜 2100 년 이상 제대로 작동하지 않는지 모르겠습니다. 도와주세요!요일 기능이 작동하지 않습니다

public static int firstOfMonth(int year) 
{ 
    int raw = year - 2000; 
    int leapYears = raw/4; 
    int nonLeapYears = 0; 
    if (raw >= 100) 
    { 
    nonLeapYears = raw/100; 
    leapYears = leapYears - (nonLeapYears - (nonLeapYears/4)); 
    } 
    else 
    { 
    nonLeapYears = 0; 
    } 
    return (((NOV1 + (raw * 365) - leapYears)) % 7); 
} 

다시, NOV1는 = 3

+4

날짜와 시간은 프로그램하기에 매우 복잡한 구조입니다. 일반적으로 Java'Calendar' API를 사용하는 것이 좋습니다. – christopher

+0

일반적으로 엄청나게 저조한 캘린더 API보다 joda 시간과 같은 것을 사용하는 것이 좋습니다. –

+0

@christopher'Calendar' API를 사용하는 것은 결코 좋은 생각이 아닙니다. 이것은 끔찍한 API입니다. Java8에는'java.time'이 있고, 이전 jre를 실행하면 사용할 수있는 joda-time도 있습니다. – amit

답변

3

문제는 당신이 그 (것)들을 추가하는 것보다 수익 문에서 윤년 차감되기 때문에 발생하는 것 같습니다.


이와 같은 오류가 발생할 수 있으며 주위의 코드가 지나치게 복잡해지면주의가 어려울 수 있습니다. 코드를 단순화 할 때 잘못된 점을 쉽게 파악할 수 있습니다. 예를 들어

, 코드의 전체 블록 :

int leapYears = raw/4; 
int nonLeapYears = 0;  
if (raw >= 100) 
    { 
    nonLeapYears = raw/100; 
    leapYears = leapYears - (nonLeapYears - (nonLeapYears/4)); 
    } 
    else 
    { 
    nonLeapYears = 0; 
    } 

가 모두 단순화 할 수 있습니다

(400) 만들기에 의해서도 년을 제외하고 100로 나누어 각 네 번째 년 마이너스 년 나눌이다
int leapYears = int(raw/4) - int(raw/100) + int(raw/400); 

감각? 당신 십일 (1), 2000 년 이후의 일 수를 계산, 통과 윤년의 수만큼 간단해야 일단 는 :

365 * raw + leapYears; 

당신은 여분의 일 윤년가있는만큼을 추가해야 윤년에는 366 일이 있기 때문에. 따라서, 귀하의 return 문은 다음과 같아야합니다 코드는 올해 2400까지 작동 당신이 있는지 확인하기 위해 검사가 필요 내가 생각

public static int firstOfMonth(int year) 
{ 
    int raw = year - 2000; 
    int leapYears = int(raw/4) - int(raw/100) + int(raw/400); 
    return (NOV1 + 365 * raw + leapYears) % 7; 
} 
+0

그 질문에 대답합니까? OP가 제기 한 실제 문제를 해결합니까? 그렇다면 - 어디에서 어떻게 만드는지 상세히 설명하십시오. 아니면 "코드 미화"입니까? – amit

+0

"코드 미화"참고 : 적은 수의 코드! = 모든 경우에 더 깔끔하고 읽기 쉽고/더 나은 코드. – drewmoore

+0

감사합니다. 내 코드는 뚜렷이 명확하지 않은 경향이 있으며, 이는 톤을 도왔습니다! – SuperCoder99

0

:

결국
return (NOV1 + 365 * raw + leapYears) % 7; 

, 당신이 뭔가를해야한다 올해는 400으로 나눌 수 있습니다 - 그러면 윤년입니다 ...