2017-06-21 417 views
4

我是新来的编程和Java,我试图解决以下问题: 20世纪期间(1901年1月1日至2000年12月31日),这个月的第一个月有多少个星期日下降?JAVA - 二十世纪(1901年1月1日至2000年12月31日)这个月的第一个月有多少个星期日下降?

这里是我的代码:

public class test { 
    public static void main(String[] args) { 
     int count, sum = 0;   
     for (int i = 1901; i < 2001; i++) { 
      LocalDate test = LocalDate.of(i,1,1); 
      sum += test.lengthOfYear(); 
     } 
     for (int i = 1; i < sum; i++) { 
      LocalDate date1 = LocalDate.of(1901,1,1); 
      date1 = date1.plusDays(i); 
     if(date1.getMonth() == JANUARY && date1.getDayOfWeek() == SUNDAY) { 
      count++; 
      } 
     } 
     System.out.println(count); 
    } 
} 

如果我打印结果,它似乎是工作的罚款。

我的结果是443,但正确的答案是171.我做错了什么?

谢谢!

回答

3

我看到一些错误:

public static void main(String[] args) { 
    int count, sum = 0;   
    for (int i = 1901; i < 2001; i++) { // There is a mistake here, I dont know what you want to compute in this loop! 
     LocalDate test = LocalDate.of(i,1,1); 
     sum += test.lengthOfYear(); 
    } 
    for (int i = 1; i < sum; i++) { 
     LocalDate date1 = LocalDate.of(1901,1,1); // There is a mistake here, date1 must be outside of this loop 
     date1 = date1.plusDays(i); // There is a mistake here, plusDays why?? 
    if(date1.getMonth() == JANUARY && date1.getDayOfWeek() == SUNDAY) { // There is a mistake here, why are you cheking this: date1.getMonth() == JANUARY ? 
     count++; 
     } 
    } 
    System.out.println(count); 
} 

一个简单的办法:

public static void main(String[] args) { 
    int count = 0; 
    LocalDate date1 = LocalDate.of(1901, Month.JANUARY, 1); 
    LocalDate endDate = LocalDate.of(2001, Month.JANUARY, 1); 
    while (date1.isBefore(endDate)) { 
     date1 = date1.plusMonths(1); 
     if (date1.getDayOfWeek() == DayOfWeek.SUNDAY) { 
      count++; 
     } 
    } 
    System.out.println(count); 
} 
+0

谢谢!我没有正确理解所要求的。愚蠢的我:)我没有想到使用isBefore ...看起来好多了。 – GeoTeo

11

我怀疑443是二十世纪一月份的星期日总数。发生这种情况是因为你走过了二十世纪所有可能的日子,然后检查当前月份是否为一月份,以及当前日期是否为星期日。

这不是你想要的。

我会用不同的方法:

  • 走过去每一年的每个月的第一天。
  • 然后检查它是否是星期天。

该代码可能会快得多。

// Each year 
for (int y = 1901; y < 2001; y++) { 
    // Each month of the year 
    for (int m = 1; m <= 12; m++) { 
     if (LocalDate.of(y, m, 1).getDayOfWeek() == DayOfWeek.SUNDAY) { 
      count++; 
     } 
    } 
} 

PS:您的代码将是正确的,如果你改变了date1.getMonth() == JANUARYdate1.getDayOfMonth() == 1。然而,这是非常低效的,因为它会检查二十世纪的每一天,而它只需要检查每个月的第一天。上述代码在我的机器上快大约40倍。

+1

或者,您可以使用'LocalDate.plusMonths'在像http://ideone.com/QW2iC3这样的单个循环中执行此操作。 –

3

您首先找到您检查期间的天数,然后启动for循环以运行该期间。到现在为止还挺好。但是,你的增加计条件是错误的:

if(date1.getMonth() == JANUARY && date1.getDayOfWeek() == SUNDAY)

这意味着,当你遍历每一天,你增加count如果该日期是一月一个星期天。你不检查那个星期天是否是一月的第一个星期,而且你没有计算二月到十二月的任何事情。

你应该检查它是月份和星期天的第一天,而不是年和周日的第一个月。

6

除了已经被标记错误,你可以重新考虑你的设计,并使用the YearMonth class这似乎是你的使用情况比LocalDate更适合:

public static void main(String[] args) { 
    YearMonth start = YearMonth.of(1901, 1); 
    YearMonth end = YearMonth.of(2000, 12); 

    int count = 0; 
    for (YearMonth ym = start; !ym.isAfter(end); ym = ym.plusMonths(1)) { 
    //is first day of month a sunday? 
    if (ym.atDay(1).getDayOfWeek() == SUNDAY) count ++; 
    } 

    System.out.println(count); //171 
} 
2

下面的代码应该输出正确的值。

public static void main(String[] args) { 
    int count = 0, sum = 0; 
    for (int i = 1901; i < 2001; i++) { 
     LocalDate test = LocalDate.of(i, 1, 1); 
     sum += test.lengthOfYear(); 
    } 

    for (int i = 1; i < sum; i++) { 
     LocalDate date1 = LocalDate.of(1901, 1, 1); 
     date1 = date1.plusDays(i); 
     if (date1.getDayOfMonth() == 1 && date1.getDayOfWeek() == java.time.DayOfWeek.SUNDAY) { 
      count++; 
     } 
    } 

    System.out.println(count); 
} 

需要注意的是:

  1. 你并不需要检查月份是一月,因为你的需求为大约每月的任何一日。
  2. 您还必须确保当天是当月的第一天。
0

443是星期日的数月,如果你想在第一个月的星期天,你必须将您的代码更改为:

if(date1.getDayOfMonth() == 1 && date1.getDayOfWeek() == SUNDAY) { 
      count++; 
      } 
     } 

Sugestion:instead of走过去每一年的每一天,你可以在1个月只需添加到日期UTIL12个月:

for (int i = 1901; i < 2001; i++) { 
     for(int mon =0; mon<12; mon++){ 
      LocalDate date1= LocalDate.of(i,mon,1); 
      if(date1.getDayOfWeek() == SUNDAY) { 
      count++; 
      } 
     } 
    } 
0

你只考虑月份一个月2001至00年,这是不正确,你应该考虑是否第一天从1901年到2000年的每个月都是星期日或者不星期一。

相关问题