微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在一个问题中得到意外的输出,该问题要求告诉日期

如何解决在一个问题中得到意外的输出,该问题要求告诉日期

这个问题来自一个网站,他们已经提供了部分代码解决方案类),要求他们制作一个程序来根据日期显示日期。

我制作了结果类,输出有时正确,有时没有编译错误。谁能告诉我逻辑错误在哪里。

还可以有人说出一种更好的方法,例如使用更少的代码。 预先感谢。

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给出了星期三

输出不正确:

  1. 2004年2月29日,给出了星期六,但应该给出周日
  2. 08 05 2999给出了周日,但应该给出了周一
  3. 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 举报,一经查实,本站将立刻删除。