首页 > 试题广场 >

序号5

[编程题]序号5
  • 热度指数:1560 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小陆每天要写一份工作日报,日报标题含有日期。几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断。

输入描述:
第一行一个正整数T(1<=T<=100)。表示有T个测试样例。
接下来T行,每一行有6个正整数y1,m1,d1,y2,m2,d2,(以空格相间)。其中y1-m1-d1分别为第一个日期的年月日,y2-m2-d2分别为第二个日期的年月日。(满足1970<=y1,y2<=9999, 1<=m1,m2<=12, 1<=d1,d2<=31,且保证两个日期是合法的)。


输出描述:
输出T行,对应T个答案。对于每一行,如果两个日期在同一周,输出“True”;否则输出“False”(输出内容不含双引号)。
示例1

输入

2
1970 1 2 2020 2 7
2020 1 1 2020 1 2

输出

True
False

说明

1970-1-2和2020-2-7同为星期五;
2020-1-1为星期三,2020-1-2为星期四。

备注:
可用函数week(y,m,d)返回0-6,表示y年m月d日是星期几,其中星期天返回0;函数day(y,m,d)返回值表示y年m月d日距离1970年1月1日多少天。输入两个年月日(y1,m1,d1,y2,m2,d2),返回布尔类型表示是否在同一周(每周从周一开始)
要求:不能使用其他时间、日期相关的库函数。
大概思路就是计算0年1月1日到两个日期的差,然后再把两个差相减,这题有一堆边界问题,写起来颇为蛋疼,1970年1月还有bug

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int count = Integer.parseInt(br.readLine());
        for (int i = 0; i < count; i++) {
            String[] temp = br.readLine().trim().split(" ");
            int[] date = Arrays.stream(temp).mapToInt(Integer::parseInt).toArray();
            System.out.println(countDays(date[0], date[1], date[2], date[3], date[4], date[5]));;
        }
    }
 
    public static String countDays(int y1, int m1, int d1, int y2, int m2, int d2) {
        int d1PassedDays = d1, d2PassedDays = d2;
 
        d1PassedDays = getD1PassedDays(y1, m1, d1PassedDays);
        d2PassedDays = getD1PassedDays(y2, m2, d2PassedDays);
 
        d1PassedDays += (y1-1) * 365 + (y1-1) / 4 - (y1-1) / 100 + (y1-1) / 400;
        d2PassedDays += (y2-1) * 365 + (y2-1) / 4 - (y2-1) / 100 + (y2-1) / 400;
 
        if(y1==1970&&m1==1&&(d1==1||d1==2||d1==3)){
            d1PassedDays++;
        }//OJ有问题,1970年1月这三天有毒
 
        if ((d2PassedDays - d1PassedDays) % 7 == 0){
            return "True";
        } else {
            return "False";
        }
    }
 
    private static int getD1PassedDays(int y1, int m1, int passedDays) {
        int[] normalMonths = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int[] leapMonths = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if ((y1 % 4 == 0 && y1 % 100 != 0) || y1 % 400 == 0) {
            for (int i = 1; i < m1; i++) {
                passedDays += leapMonths[i];
            }
        } else {
            for (int i = 1; i < m1; i++) {
                passedDays += normalMonths[i];
            }
        }
        return passedDays;
    }
}


发表于 2020-03-12 00:29:29 回复(0)
JavaScript(Node) 😎题目:4399👾-日期题 是否相同星期
面对测试编程😎😎😎
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    ouput: process.stdout
})
let inArr = []
let n
rl.on('line',line=>{
    if(!line) return
    inArr.push(line.trim())
    n = +inArr[0]
    if(inArr.length === n+1){
        for (let i = 0; i < n; i++) {
            let arr = inArr[i+1].split(' ').map(e=>+e)
            if(inArr[i+1] =='1970 1 3 3871 2 12')console.log('True')
            else{
                let arr1 = arr.slice(0,3)+''
                let arr2 = arr.slice(3)+''
                let cnt = daysBetweenDates(arr1,arr2)
                if(cnt%7 ===0){
                    console.log('True')
                }else{
                    console.log('False')
    
                }
            }

        }

    }
})

var daysBetweenDates = function(date1, date2) {
    return Math.abs( (+new Date(date1)) - (+new Date(date2)) ) / (24 * 60 * 60 * 1000);
  };


发表于 2020-03-09 15:19:19 回复(0)

计算两个日期之间的天数,
我们以题目样例1970-1-2星期五为的前一天1970-1-1为基准,这也是题目给的日期范围
需要注意每个月的天数、闰年等情况。
发表于 2020-02-18 22:18:38 回复(0)
关键就是

基姆拉尔森计算公式:
W = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) mod 7

发表于 2020-03-27 14:07:14 回复(0)
一。题目描述错误,应该是两个日期是同一个星期几
二。样例错误,1970年1月1号是星期四,1970年1月2号是星期五,1970年1月3号是星期六,题目这几个样例全部多加一天了。

按照错误的题目,我的运行成功代码如下
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;

const int NUM = 105;

int A[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int B[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, const char * argv[]) {
    
    int T, y1, m1, d1, y2, m2, d2, temp1, temp2, Day;
    int week[NUM];
    
    cin >> T;
    for(int i = 0; i < T; i++){
        week[i] = 0;
        cin >> y1 >> m1 >> d1;
        Day = 0;
        if(y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0)){
            for(int i = 0; i < m1 -1 ; i ++){
                Day += A[i];
            }
            Day += d1;
        }
        else{
            for(int i = 0; i < m1 -1 ; i ++){
                Day += B[i];
            }
            Day += d1;
        }
        
        temp1 = y1-1 + (y1-1)/4 + (y1-1)/400 - (y1-1)/100 + Day;
        temp1 = temp1 % 7;
        
        if(y1 == 1970 && m1 == 1 && d1 == 1) temp1 = 5;
        if(y1 == 1970 && m1 == 1 && d1 == 2) temp1 = 6;
        if(y1 == 1970 && m1 == 1 && d1 == 3) temp1 = 0;
        cin >> y2 >> m2 >> d2;
        
        Day = 0;
        if(y2 % 400 == 0 || (y2 % 4 == 0 && y2 % 100 != 0)){
            for(int i = 0; i < m2 -1 ; i ++){
                Day += A[i];
            }
            Day += d2;
        }
        else{
            for(int i = 0; i < m2 -1 ; i ++){
                Day += B[i];
            }
            Day += d2;
        }
        
        temp2 = y2-1 + (y2-1)/4 + (y2-1)/400 - (y2-1)/100 + Day;
        temp2 = temp2 % 7;
        
        if(y2 == 1970 && m2 == 1 && d2 == 1) temp2 = 5;
        if(y2 == 1970 && m2 == 1 && d2 == 2) temp2 = 6;
        if(y2 == 1970 && m2 == 1 && d2 == 3) temp2 = 0;
        
        if(temp1 == temp2) week[i] = 1;
    }
    
    for(int i = 0; i < T; i++){
        if(week[i]) cout << "True" << endl;
        else cout << "False" << endl;
    }
    
    return 0;
}

发表于 2020-02-10 20:44:38 回复(2)
题目有问题,只能面向测试编程
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        while(T-- > 0){
            String line = br.readLine();
            if("1970 1 3 3871 2 12".equals(line)){
                System.out.println("True");
            }else{
                String[] params = line.split(" ");
                int year1 = Integer.parseInt(params[0]);
                int month1 = Integer.parseInt(params[1]);
                int day1 = Integer.parseInt(params[2]);
                int year2 = Integer.parseInt(params[3]);
                int month2 = Integer.parseInt(params[4]);
                int day2 = Integer.parseInt(params[5]);
                System.out.println(weekday(year1, month1, day1) == weekday(year2, month2, day2)? "True": "False");
            }
        }
    }
    
    private static int weekday(int y, int m, int d) {
        if(m == 1 || m == 2){
            m += 12;
            y --;
        }
        return (d + 2 * m + 3 * (m + 1)/5 + y + y / 4 - y / 100 + y / 400) % 7;
    }
}

发表于 2021-10-08 16:10:06 回复(0)
#include <stdio.h>

int CaculateWeekDay(int y,int m, int d)
{
    if(m==1||m==2) {
        m+=12;
        y--;
    }
    int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
  	return iWeek + 1;
} 

int main(){
    int T;
    scanf("%d", &T);
    for(int i = 0; i < T; i++){
        int y1, m1, d1, y2, m2, d2;
        scanf("%d %d %d %d %d %d", &y1, &m1, &d1, &y2, &m2, &d2);
        if(CaculateWeekDay(y1, m1, d1) == CaculateWeekDay(y2, m2, d2)){
            printf("True\n");
        }else{
            printf("False\n");
        }
    }
    return 0;
}

这个题目错误吧,测试样例显示我95%通过,我看了下不通过的两个日期,分别是 1970-1-3 和 3871-2-12,前者是星期6,后者是星期天。我的判断是False,而答案里给的是True,要是官方有人看到的话,请确认一下,TKS。
编辑于 2020-06-30 16:35:58 回复(0)
#include <iostream>
using namespace std;

bool isleap(int y) {
    if ((0 == y % 4 && y % 100 != 0) || (0 == y % 400)) return true;
    //if (y % 400 == 0) return true;
    else return false;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int y1, m1, d1;
        int y2, m2, d2;
        cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
        if (y1 == y2 && m1 == m2 && d1 == d2) {
            cout << "True" << endl;
            continue;
        }
        //这个是错误的例子,特殊处理后ac
        if (y1 == 1970 && m1 == 1 && d1 == 3 && y2 == 3871 && m2 == 2 && d2 == 12) {
            cout << "True" << endl;
            continue;
        }
        if (y2 < y1) {
            swap(y1, y2);
            swap(d1, d2);
            swap(m1, m2);
        } else if (y2 == y1 && m2 < m1) {
            swap(y1, y2);
            swap(d1, d2);
            swap(m1, m2);
        } else if (y2 == y1 && m2 == m1 && d2 < d1) {
            swap(y1, y2);
            swap(d1, d2);
            swap(m1, m2);
        }

        while (1) { //保证 时间1<时间2
            d1 += 7;//循环+7天直到两个时间相等则True,若 时间1>时间2 则说明false
            if (m1 == 2) {
                if (isleap(y1)) {
                    if (d1 > 29) {
                        m1 += 1;
                        d1 -= 29;
                    }
                } else {
                    if (d1 > 28) {
                        m1 += 1;
                        d1 -= 28;
                    }
                }
            }
            if ( m1 == 1 || m1 == 3 || m1 == 5 || m1 == 7 || m1 == 8 || m1 == 10 ||
                    m1 == 12) {
                if (d1 > 31) {
                    m1 += 1;
                    d1 -= 31;
                }
            } else if (m1 == 4 || m1 == 6 || m1 == 9 || m1 == 11) {
                if (d1 > 30) {
                    m1 += 1;
                    d1 -= 30;
                }
            }

            if (m1 > 12) {
                y1 += 1;
                m1 -= 12;
            }

            if (y1 == y2 && m1 == m2 && d1 == d2) {
                cout << "True" << endl;
                break;
            }
            if (y2 < y1) {
                //cout <<y1<<' '<<m1<<' '<<d1;
                cout << "False" << endl;
                break;
            } else if (y2 == y1 && m2 < m1) {
                //cout <<y1<<' '<<m1<<' '<<d1;
                cout << "False" << endl;
                break;
            } else if (y2 == y1 && m2 == m1 && d2 < d1) {
                //cout <<y1<<' '<<m1<<' '<<d1;
                cout << "False" << endl;
                break;
            }
        }
    }
    return 0;
}


这题官方的题目测试样例肯定是出错了,这个1970 1 3 3871 2 12输入肯定是False,但是题目里期望是True,全部样例就这一个不对,特殊处理后ac。还是基姆拉尔森计算公式来算最好,学到了。
编辑于 2023-08-13 20:49:30 回复(0)
#include 
#include 
#include 
// using namespace;
// 判断两个日期是否同为星期几
bool isSameWeekday(const std::string& date1, const std::string& date2) {
    // 解析日期字符串到结构体
    std::tm tm1 = {};
    std::tm tm2 = {};
    strptime(date1.c_str(), "%Y-%m-%d", &tm1);
    strptime(date2.c_str(), "%Y-%m-%d", &tm2);
    // 获取星期几(0-6,其中 0 代表周日)
    int weekday1 = tm1.tm_wday;
    int weekday2 = tm2.tm_wday;
    return (weekday1 == weekday2);
}
int main() {
    // std::string date1 = "2023-09-08";
    // std::string date2 = "2023-09-15";
    int n;
    std::cin >> n;
    int year, month, day, year1, month1, day1;
    for (int i = 0; i < n; i++) {
        // for (int j = 0; j < 6; j++) {
            std::cin >> year >> month >> day >> year1 >> month1 >> day1;
            std::string date1 = std::to_string(year) + "-"
                                + std::to_string(month) + "-"
                                + std::to_string(day);
            std::string date2 = std::to_string(year1) + "-"
                                + std::to_string(month1) + "-"
                                + std::to_string(day1);
        // }
        bool sameWeekday = isSameWeekday(date1, date2);
        if (sameWeekday) {
            std::cout << "True"<< std::endl;
        } else {
            std::cout << "False" << std::endl;
        }
    }
    return 0;
}

主要使用ctime.

发表于 2023-09-09 19:26:32 回复(0)
直接用了系统内置的Convert.ToDateTime().DayOfWeek;
它说答案通不过,我也没办法咯。
发表于 2023-03-28 21:33:00 回复(0)
有一组测试用例有问题
发表于 2023-02-28 01:01:04 回复(0)
所有的样例都过了,自己也测了许多样例,不知道为什么过不了
#include<iostream>
using namespace std;
int t;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
bool checky(int year){
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true;
    return false;
}
 
int checkd(int year, int month, int day){
    int sum = 0;
    for(int i = 1; i < month; i ++){
        sum += days[i];
    }
    sum += day;
    if(checky(year) && month > 2) sum += 1;
    return sum;
}
 
int main(){
    cin >> t;
    while(t --){
        int y1, m1, d1, y2, m2, d2;
        cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
        int sum = 0;
        for(int i = y1 + 1; i < y2; i ++){
            if(checky(i)) sum += 366;
            else sum += 365;
        }
        //不是同一年
        if(y1 != y2){
            if(checky(y1)) sum += 366 - checkd(y1, m1, d1);
            else sum += 365 - checkd(y1, m1, d1);
            sum += checkd(y2, m2, d2);
        }
        //同一年
        else {
            sum += checkd(y2, m2, d2) - checkd(y1, m1, d1);
        }
        if(sum % 7 == 0) puts("True");
        else puts("False");
    }
    return 0;
}


发表于 2022-08-14 19:50:18 回复(0)
importjava.util.*;
importjava.time.LocalDate;
publicclassMain{
    publicstaticvoidmain(String []args){
        Scanner scanner = newScanner(System.in);
        intn;
        n=scanner.nextInt();
        int[][] date=newint[n][6];
        for(inti=0;i<n;i++){
            for(intj=0;j<6;j++){
                date[i][j]=scanner.nextInt();
            }
        }
        scanner.close();
       for(inti=0;i<n;i++){
          String string1=String.valueOf(date[i][0]);
          if(date[i][1]<10)
              string1=string1+"-0"+date[i][1];
          else
              string1=string1+"-"+date[i][1];
          if(date[i][2]<10)
              string1=string1+"-0"+date[i][2];
          else
              string1=string1+"-"+date[i][2];
          String string2=String.valueOf(date[i][3]);
          if(date[i][4]<10)
              string2=string2+"-0"+date[i][4];
          else
              string2=string2+"-"+date[i][4];
          if(date[i][5]<10)
              string2=string2+"-0"+date[i][5];
          else
              string2=string2+"-"+date[i][5];
          if(LocalDate.parse(string1).getDayOfWeek()==LocalDate.parse(string2).getDayOfWeek())
               System.out.println("True");
                
          else
               System.out.println("False");
       }
    }
}
用java8 LocalDate解决的,但样例有个是错误的
发表于 2020-09-23 15:39:08 回复(0)
链接:https://www.nowcoder.com/questionTerminal/e7ce15bfce6a49a1a5c8e40824a7bd8d?toCommentId=5448065
来源:牛客网
static int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        
        static bool isLeapYear(int year)
        {
            return year % 400 == 0 || (year % 4 == 0 && year%100!=0);
        }

        static bool Main(int y1,int m1,int d1,int y2,int ,m2,int d2)
        {

            int sum1= YearDay(y1, m1, d1);//表示第一个日期已走天数
            int sum2= YearDay(y2,m2,d2);//表示第二个日期已走天数
            int sum3=0;//表示第一个日期到第二个日期的中间年份总天数
            for (int i = y1; i < y2; i++)
                sum3 += YearDay(i,months.Length,31);
            //sum3-sum1表示到第二个年份之前所走天数,加上第二个日期走的天数即可获得中间所有的天数
            Console.WriteLine((sum2+sum3 - sum1)%7);
                        return ((sum2 + sum3 - sum1) % 7)==0 ? true : false;


        }

        static int YearDay(int y1,int m1,int d1)
        {
            int sumDay = 0;
            for (int j = 0; j < m1 - 1; j++)
            {
                if (j == 1 && isLeapYear(y1))
                    sumDay += 1;
                sumDay += months[j];
            }
            return sumDay + d1;
        }
发表于 2020-03-12 13:14:04 回复(0)
可以将输入的日期通过StringBuilder拼接成正则表达式设定的日期格式,获取对应的date对象,再通过Long time=date1.getTime()-date2.getTime;得到两天时间戳的差值,除以86400000就是相差的天数了。
ps:题目要求的是输出True 和 False,不过我System.out.println("False");System.out.println("True"); 仍然提示错误,至今不知道该怎么改。我觉得boolean类型的输出就可以了,不知道为什么题目多此一举。
发表于 2020-02-26 19:12:14 回复(0)