如何解决在一个问题中得到意外的输出,该问题要求告诉日期
这个问题来自一个网站,他们已经提供了部分代码(解决方案类),要求他们制作一个程序来根据日期显示日期。
我制作了结果类,输出有时正确,有时没有编译错误。谁能告诉我逻辑错误在哪里。
还可以有人说出一种更好的方法,例如使用更少的代码。 预先感谢。
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
class Result {
int month,day,year;
public static boolean leap(int year){
if(year%400==0){
return true;
}
else if(year%100==0){
return false;
}else if(year%4==0){
return true;
}else{
return false;
}
};
public static int year_count(int year){
int count=0;
for(int i=2000;i<year;i++){
if(leap(year)){
count += 366;
}
else{
count += 365;
}
};
return count;
};
public static int month_count(int m,int y){
int k=m-1;
int [] ny = {31,28,31,30,31};
int [] ly = {31,29,31};
if(leap(y)){
if(k==1){
return 31;
}
else{
return ly[k] + month_count(k-1,y);
}
}else{
if(k==1){
return 31;
}
else{
return ny[k] + month_count(k-1,y);
}
}
};
public static int total_count(int d,int m,int y){
return d+month_count(m,y)+year_count(y);
}
public static String findDay(int month,int day,int year) {
int n = total_count(day,month,year) % 7;
String [] days={"MONDAY","TUESDAY","WednESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"};
return days[n];
}
}
//no need check this below part as it was given by the browser from which the question was taken
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(system.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$","").split(" ");
int month = Integer.parseInt(firstMultipleInput[0]);
int day = Integer.parseInt(firstMultipleInput[1]);
int year = Integer.parseInt(firstMultipleInput[2]);
String res = Result.findDay(month,year);
bufferedWriter.write(res);
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
输出正确无误:
1.02 13 2010给出了星期六
2.08 05 2015给出了星期三
输出不正确:
- 2004年2月29日,给出了星期六,但应该给出周日
- 08 05 2999给出了周日,但应该给出了周一
- 2012年6月4日为星期一,但应为星期五
解决方法
代码中有一些错误。
错误1:
year_count
检查传入的年份是否是is年,而不是您在循环中迭代的年份。更改为:
for(int i=2000;i<year;i++){
if(leap(i))
错误2:
month_count
跳过了几个月。由于k = m-1,因此对month_count
的递归调用应使用k,而不是k-1。它还使用错误的索引来查找错误索引中的天数。更改为:
return ly[k-1] + month_count(k,y);
和:
return ny[k-1] + month_count(k,y);
错误3:
findDay
假定2000年1月1日为星期日。这是星期六。因此,天数应从FRIDAY开始:
String [] days={"FRIDAY","SATURDAY","SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY"};
还可以用更少的代码告诉更好的方法。
使用java.time
包中的标准库类:
public static String findDay(int month,int day,int year) {
return LocalDate.of(year,month,day).getDayOfWeek().name();
}
,
我建议您使用java.time
date-time API进行操作。从 Trail: Date Time 了解有关此现代日期时间API的更多信息。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Test strings
String[] dateStrings = { "02 13 2010","08 05 2015","02 29 2004","08 05 2999","04 06 2012" };
// Define formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd uuuu");
for (String dateString : dateStrings) {
System.out.println(LocalDate.parse(dateString,formatter).getDayOfWeek());
}
}
}
输出:
SATURDAY
WEDNESDAY
SUNDAY
MONDAY
FRIDAY
,
我不知道您的代码出了什么问题,但是我可以建议一种更好的方法: Java中有一个Calendar类(java.util.Calendar),可用于解决此问题:
public static String findDay(int month,int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.DAY_OF_MONTH,day);
cal.set(Calendar.YEAR,year);
String[] day_of_week = {"SUNDAY","THURSDAY","FRIDAY","SATURDAY"};
return day_of_week[cal.get(Calendar.DAY_OF_WEEK)-1];
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。