首页 > 试题广场 >

美国节日

[编程题]美国节日
  • 热度指数:2132 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下:
* 1月1日:元旦
* 1月的第三个星期一:马丁·路德·金纪念日
* 2月的第三个星期一:总统节
* 5月的最后一个星期一:阵亡将士纪念日
* 7月4日:美国国庆
* 9月的第一个星期一:劳动节
* 11月的第四个星期四:感恩节
* 12月25日:圣诞节
现在给出一个年份,请你帮忙生成当年节日的日期。

输入描述:
输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。


输出描述:
对应每一组数据,以“YYYY-MM-DD”格式输出当年所有的节日日期,每个日期占一行。

每组数据之后输出一个空行作为分隔。
示例1

输入

2014
2013

输出

2014-01-01
2014-01-20
2014-02-17
2014-05-26
2014-07-04
2014-09-01
2014-11-27
2014-12-25

2013-01-01
2013-01-21
2013-02-18
2013-05-27
2013-07-04
2013-09-02
2013-11-28
2013-12-25
这种坑,试问咋能解
发表于 2019-07-08 12:03:34 回复(7)
【题目解析】:
题目表述很明白,难点在于我们要求一个月第N个星期W。那么面对这个问题,我们拆解的思路是,首先,我们要想找到一个月第N个星期W,一定需要一个参照物,最好的目标当然是这个月的第一天。拿到参照物后,我要能得到参照物的星期数,然后就能得到结果了。所以这个题有两个难点:判断某个月的1号到底是周几,然后根据这个星期数得到这个月第N个星期W。这两个功能写成函数,即可通过反复调用拿到结果。
【解题思路】:
第一个难点是如何判断一天到底是周几。那么为了判断一天到底是周几,我们有以下两种手段:
1、找个参照日,写一个日期计算器,算出两个天数之间的差值后对7取余数即可知道目标日期是星期几。
2、通过蔡勒公式计算星期数:

公式中w就是计算出的星期;c是世纪,其值为真实的世纪数-1,也就是y / 100的结果;y是这是这个世纪的第几年,也就是y % 100;m是月,但是1月和2月要看做13月和14月计算;d是日。根据泰勒公式,我们只需要知道年月日,就可以算出星期。然而因为现行的格里历,所以在1582年之前的日期,我们要采用另一个公式,本题中用不到,可以参考百度百科:https://baike.baidu.com/item/%E8%94%A1%E5%8B%92%E5%85%AC%E5%BC%8F
两个方法比较而言,肯定是方法2的代码更好写,所以我们就用泰勒公式就好。

第一个难点解决了,第二个难点,如何通过这个参照点拿到一个月的第N个星期W。
那么,我们假设要拿到一个月的第一个周五,我们要怎么做呢?一个很简单的思路就是,先看看这个月的1号是周几,然后往后数就行了,假如1号是周四,那么2号就是第一个周五,假如1号是周六,那么7号就是第一个周五。
那么,怎么拿到这个向后的天数呢?我们发现,如果所求星期数比1号星期数大,那么直接相减后+1就是那一天了,例如1号周三,我要周五,那么(5-3)+1即可求出第一个周五是3号。那么反过来是所求星期数小,例如1号周三,我要周一,那么显然要先把周一看成周八才行。也就是(8-3)+1。第一个周一是6号。但是这样要判断,所以干脆统统都让它加7以后减,减完后的结果再mod一下7,就能得到结果了。也就是:(所求星期数 + 7 - 1号星期数) % 7 + 1。这样我们就拿到了求第一个周几公式。随后,我们只需要在这个公式上,加上7 * (n - 1),即刻求出第n个周几。
而面对某个月的最后一个周几,我们要做的是拿到下个月的第一天然后往回推即可。
#include <iostream>
#include <cstdio>
using namespace std;
// 根据 年-月-日 通过蔡勒公式计算当前星期几
int day_of_week(int year, int month, int day){
    if(month == 1 || month == 2){
        month += 12;
        year -= 1;
    }
    int century = year / 100;
    year %= 100;
    int week = century / 4 - 2 * century + year + year / 4 + (13 * (month + 1)) / 5 + day - 1;
    week = (week % 7 + 7) % 7;
    if(week == 0){
        week = 7;
    }
    return week;
}
// 给定年月和第几周的星期几,求出是该月的几号几号
int day_of_demand(int year, int month, int count, int d_of_week){
    int week = day_of_week(year, month, 1);// 计算该月1号是星期几
    // 1 + 7(n - 1) + (所求星期数 + 7 - 1号星期数) % 7
    int day = 1 + (count - 1) * 7 + (7 + d_of_week - week) % 7;
    return day;
}
// 元旦
void new_year_day(int year){
    printf("%d-01-01\n", year);
}
// 马丁·路德·金纪念日(1月的第三个星期一)
void martin_luther_king_day(int year){
    printf("%d-01-%02d\n", year, day_of_demand(year, 1, 3, 1));
}
// 总统日(2月的第三个星期一)
void president_day(int year){
    printf("%d-02-%02d\n", year, day_of_demand(year, 2, 3, 1));
}
// 阵亡将士纪念日(5月的最后一个星期一)
void memorial_day(int year){
    // 从 6 月往前数
    int week = day_of_week(year, 6, 1);
    // 星期一的话,从 31 号往前数 6 天,否则,数 week - 2 天
    int day = 31 - ((week == 1) ? 6 : (week - 2));
    printf("%d-05-%02d\n", year, day);
}
// 国庆
void independence_day(int year){
    printf("%d-07-04\n", year);
}
// 劳动节(9月的第一个星期一)
void labor_day(int year){
    printf("%d-09-%02d\n", year, day_of_demand(year, 9, 1, 1));
}
// 感恩节(11月的第四个星期四)
void thanks_giving_day(int year){
    printf("%d-11-%02d\n", year, day_of_demand(year, 11, 4, 4));
}
// 圣诞节
void christmas(int year){
    printf("%d-12-25\n\n", year);
}
// 美国节日
void holiday_of_usa(int year){
    new_year_day(year);
    martin_luther_king_day(year);
    president_day(year);
    memorial_day(year);
    independence_day(year);
    labor_day(year);
    thanks_giving_day(year);
    christmas(year);
}
int main(){
    int year;
    while(cin >> year){
        holiday_of_usa(year);
    }
    return 0;
}

发表于 2020-07-18 11:22:46 回复(1)
#include "iostream" 
using namespace std; 
int WeekToDay(int y,int m,int c,int w,bool B){//输入哪年哪月第几个星期几,以及正数还是倒数,输出几号 
	int d,week,i;
	if(m==1){m=13;y--;}//公式要求1月、2月要转为上一年13、14月 
    if(m==2){m=14;y--;}
    i = 0;
    for(d = B?1:31; d <= B?31:1; B?(d++):(d--)){//B:正数/倒数 
    week =(d + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;//蔡勒公式 
    if(week+1 == w) ++i;
    if(i == c) break;
 } 
 return d; 
}

int main(void){
 int y; 
 while(cin>>y){
 cout<<y<<"-01-01"<<endl;
 printf("%d-01-%02d\n",y,WeekToDay(y,1,3,1,1));
 printf("%d-02-%02d\n",y,WeekToDay(y,2,3,1,1));
 printf("%d-05-%02d\n",y,WeekToDay(y,5,1,1,0));//倒数
 cout<<y<<"-07-04"<<endl;
 printf("%d-09-%02d\n",y,WeekToDay(y,9,1,1,1));
 printf("%d-11-%02d\n",y,WeekToDay(y,11,4,4,1));
 cout<<y<<"-12-25"<<endl<<endl; 
 }
 return 0;
}

发表于 2015-09-25 01:32:32 回复(1)
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class _t142 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int y=in.nextInt();
			int mon[]=new int[]{1,2,5,9,11};
			int len=mon.length;
			int wek[]=new int[len];
			// 创建 Calendar 对象  
		    Calendar cal = Calendar.getInstance();  
		    try {
			    // 对 calendar 设置时间的方法  
		        // 设置传入的时间格式  
		        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d");  
		        for (int i = 0; i < len; i++) {// 指定一个日期  
		        	Date date = dateFormat.parse(y+"-"+mon[i]+"-1"); 
		        	cal.setTime(date);// 对 calendar 设置为 date 所定的日期  
		        	int week = cal.get(Calendar.DAY_OF_WEEK)-1; //每月1号位于星期几
		        	if(week==0) week=7;
		        	wek[i]=week;
//		        	System.out.println(week); 
				}
		    } catch (Exception e) {
		    	
			}
		    
		    System.out.println(y+"-01-01");
		    
		    //1月的第三个星期一
		    int jan=wek[0];
		    int rs=0;
		    String strRs="";
		    if(jan==1){
		    	rs=2*7+1;
		    }
		    else{
		    	rs=3*7-(jan-1)+1;
		    }
		    strRs=rs/10==0?"0"+rs:String.valueOf(rs);
		    System.out.println(y+"-01-"+strRs);
		    
		    //2月的第三个星期一
		    int feb=wek[1];
		    if(feb==1){
		    	rs=2*7+1;
		    }
		    else{
		    	rs=3*7-(feb-1)+1;
		    }
		    strRs=rs/10==0?"0"+rs:String.valueOf(rs);
		    System.out.println(y+"-02-"+strRs);
		    
		    //5月的最后一个星期一(星期一:一个月(4~5次))
		    int may=wek[2];
		    if(may>=6){//第五个星期一
		    	rs=may==6?31:30;
		    }
		    else{//第四个星期一
		    	rs=4*7-(may-1)+1;
		    }
		    strRs=rs/10==0?"0"+rs:String.valueOf(rs);
		    System.out.println(y+"-05-"+strRs);
		    
		    System.out.println(y+"-07-04");
		    
		    //9月的第一个星期一
		    int sep=wek[3];
		    if(sep==1){
		    	rs=1;
		    }
		    else{
		    	rs=1*7-(sep-1)+1;
		    }
		    strRs=rs/10==0?"0"+rs:String.valueOf(rs);
		    System.out.println(y+"-09-"+strRs);
		    
		    //11月的第四个星期四
		    int nov=wek[4];
		    rs=4*7-(nov-1)+1+3;
		    strRs=rs/10==0?"0"+rs:String.valueOf(rs);
		    System.out.println(y+"-11-"+strRs);
		    
		    System.out.println(y+"-12-25");
		    System.out.println();
		}
	}
}
Q:在IDE上秒出答案的,说我运行超时,醉了~
发表于 2016-10-17 10:30:36 回复(1)
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int year=0;
    while(cin>>year)
    {
    int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    vector<int> week(7);
        int weekday=0;
        for(int i=2000;i<year;i++)
            weekday+=365+(((i%4==0)&&(i%100!=0))||(i%400==0));
        weekday=(weekday+5)%7;//该年的1月1号是星期几(以2000年1月1号为星期六为基准)
        int day=1;//记录当前是几号
        if(((year%4==0)&&(year%100!=0))||(year%400==0))//如果这年是闰年,二月按29天计算
            arr[2]=29;
        for(int month=1/*记录当前是几月*/;month<13;day++,weekday=(weekday+1)%7)
        {
            if(day==arr[month]+1)
            {
                for(auto& e:week)//将记录数组置空
                    e=0;
                day=1;
                month++;
            }
            week[weekday]++;//利用week来记录现在经过了几个星期几
                if(month==1&&day==1)
                    printf("%d-01-01\n",year);
                if(month==1&&week[0]==3&&weekday==0)//week[0]的值表示这个月经过了第几个星期一
                    printf("%d-%02d-%02d\n",year,1,day);
                if(month==2&&week[0]==3&&weekday==0)
                    printf("%d-%02d-%02d\n",year,2,day);
                if(month==5&&weekday==0&&day>=25)
                    printf("%d-%02d-%02d\n",year,5,day);
                if(month==7&&day==4)
                    printf("%d-07-04\n",year);
                if(month==9&&week[0]==1&&weekday==0)
                    printf("%d-%02d-%02d\n",year,9,day);
                if(month==11&&week[3]==4&&weekday==3)
                    printf("%d-%02d-%02d\n",year,11,day);
                if(month==12&&day==25)
                    printf("%d-12-25\n",year);
        }
        cout<<endl;
    }
    return 0;
}

编辑于 2022-05-08 22:59:54 回复(0)
#include<iostream>
using namespace std;
//输入 某年某月第几个星期几,正数还是倒数,输出 几号
int WeekDay(int y,int m,int n,int w,bool B)
{
    int day,week,i=0;
    if(m==1) {m=13; y--;}
    if(m==2) {m=14; y--;}
    for( day = B?1:31; day <= B?31:1; B?(day++):(day--) )
    {
        week=(day + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400)%7;//蔡勒公式 
        if(week+1==w) ++i;
        if(i==n) break;
    }
    return day;
}
int main(void)
{
    int year;
    while(cin>>year)
    {
        cout<<year<<"-01-01"<<endl; //元旦
        //WeekDay(年,月,第几个星期,星期几,正数1倒数0)
        printf("%d-01-%02d\n",year,WeekDay(year,1,3,1,1));
        printf("%d-02-%02d\n",year,WeekDay(year,2,3,1,1));
        printf("%d-05-%02d\n",year,WeekDay(year,5,1,1,0));
        cout<<year<<"-07-04"<<endl;
        printf("%d-09-%02d\n",year,WeekDay(year,9,1,1,1));
        printf("%d-11-%02d\n",year,WeekDay(year,11,4,4,1));
        cout<<year<<"-12-25"<<endl<<endl;
    }
    return 0;
}

发表于 2021-05-31 18:18:33 回复(0)
import java.util.Scanner;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.TemporalAdjusters;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int year = in.nextInt(); // 指定的年份

            // 元旦
            LocalDate newYear = LocalDate.of(year, Month.JANUARY, 1);
            System.out.println(newYear);

            // 马丁·路德·金纪念日(1月的第三个星期一)
            LocalDate mlkDay = LocalDate.of(year, Month.JANUARY, 1)
                               .with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.MONDAY));
            System.out.println(mlkDay);

            // 总统节(2月的第三个星期一)
            LocalDate presidentsDay = LocalDate.of(year, Month.FEBRUARY, 1)
                                      .with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.MONDAY));
            System.out.println(presidentsDay);

            // 阵亡将士纪念日(5月的最后一个星期一)
            LocalDate memorialDay = LocalDate.of(year, Month.MAY, 1)
                                    .with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));
            System.out.println(memorialDay);

            // 美国国庆
            LocalDate independenceDay = LocalDate.of(year, Month.JULY, 4);
            System.out.println(independenceDay);

            // 劳动节(9月的第一个星期一)
            LocalDate laborDay = LocalDate.of(year, Month.SEPTEMBER, 1)
                                 .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
            System.out.println(laborDay);

            // 感恩节(11月的第四个星期四)
            LocalDate thanksgivingDay = LocalDate.of(year, Month.NOVEMBER, 1)
                                        .with(TemporalAdjusters.dayOfWeekInMonth(4, DayOfWeek.THURSDAY));
            System.out.println(thanksgivingDay);

            // 圣诞节
            LocalDate christmasDay = LocalDate.of(year, Month.DECEMBER, 25);
            System.out.println(christmasDay);
            System.out.println();
        }
    }
}

发表于 2023-11-21 09:23:40 回复(0)
import java.util.*;

public class Main{
    
    public static boolean isLeapYear(int y){
        if(y % 100 != 0){
            if(y % 4 == 0){
                return true;
            }
        }else{
            if(y % 400 == 0){
                return true;
            }
        }
        return false;
    }
    
   static int[] days = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    public static int nDays(int y,int m,int d){
        int n = d;
        for(int i = 1; i <= m-1; i++){
            n += days[i];
        }
        if(m > 2 && isLeapYear(y)){
            n++;
        }
        return n;
    }
    
    public static int diff(int y,int m,int d){
        return y-1+(y-1)/4-(y-1)/100+(y-1)/400+nDays(y,m,d);
    }
    
    public static int week(int y,int m,int d){
        int w = diff(y,m,d)%7;
        if(w == 0){
            w = 7;
        }
        return w;
    }
    
    //已知当月的1号是星期w,求第n个星期e是多少号
    public static int m1(int w,int n,int e){
        return 1+(n-1)*7+(7-w+e)%7;
    }
    
    public static int m2(int w){
        int d = (w == 1)?7:(w-1);
        return 32-d;
    }
    
    
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext())
        {
            int y = scan.nextInt();
            System.out.printf("%d-01-01\n",y);
            int w;
            
            
            w = week(y,1,1);
            System.out.printf("%d-01-%02d\n",y,m1(w,3,1)); //第三个星期一
            
            w = week(y,2,1);
            System.out.printf("%d-02-%02d\n",y,m1(w,3,1)); //第三个星期一
            
            w = week(y,6,1);
            System.out.printf("%d-05-%02d\n",y,m2(w));
            
            System.out.printf("%d-07-04\n",y);
            
            w = week(y,9,1);
            System.out.printf("%d-09-%02d\n",y,m1(w,1,1)); //第一个星期一
            
            w = week(y,11,1);
            System.out.printf("%d-11-%02d\n",y,m1(w,4,4)); //第四个星期四
            
            System.out.printf("%d-12-25\n",y);
            
            System.out.println();
        }
    }
}

发表于 2023-02-13 17:22:46 回复(0)
import java.util.*;
public class Main{
           public static boolean isRn(int year) {//判断是不是闰年
        if(((year%4==0)&&year%100!=0)||(year%400==0)){
            return true;
        }
           return false;

    }
    public static   int day_of_week(int year, int month, int day)//蔡勒公式,给年月日计算出这天是星期几
    {
        if (month == 1 || month == 2)
        {
            month += 12;
            year -= 1;
        }

        int century = year / 100;
        year %= 100;
        int week = year + (year / 4) + (century / 4) - 2 * century + 26 * (month + 1) / 10 + day -
                1;
        week = (week % 7 + 7) % 7;

        if (week == 0)
        {
            week = 7;
        }

        return week;
    }

    public static void printFunc(int y,int m,int d) {
        String str1="-";
        String str2="-";
        boolean f1=false;
        boolean f2=false;
        if(m/10==0){
            f1=true;
            str1+=0;
        }
        if(d/10==0){
            f2=true;
            str2+=0;
        }
        System.out.println(y + str1 + m + str2 + d);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int y = scanner.nextInt();
            boolean f=isRn(y);
            for (int m = 1; m <= 12; ) {
                    int x = 0;
                    if (m % 2 == 0) {//偶数月
                        if (m == 2) {
                            if (f) {
                                x = 29;
                            } else {
                                x = 28;
                            }
                        } else {
                            x = 30;
                        }
                    } else {
                        x = 31;
                    }
                    int tmp=day_of_week(y,m,1);//这年这月第一天是星期几
                    boolean flg=false;//后面用于标记劳动节的
                    for (int d = 1; d <= x; d++) {
                        int j=(d+tmp)/7+1;//第几个星期
                        // 注意,第几个星期!=第几个星期几
                        //比如你这个月是星期4是1号,那你第一个星期3,是第二个星期才出现的

                        int w = day_of_week(y,m,d);//这年这月这日是星期几
                        //蔡勒公式,给一个年月日计算是星期几

                        if ((m == 1 && d == 1) || (m == 7 && d == 4) || (m == 12 && d == 25)) {//指定节日
                            if(m<10){
                                System.out.println(y + "-0" + m + "-0" + d);
                            }else{
                                System.out.println(y + "-" + m + "-" + d);
                            }
                            continue;
                        } else if (m == 1  && w == 1) {//马丁路德金纪念日
                            if(1<tmp){
                                //比如你这个月是星期3是1号,那你第三个星期1,是第四个星期才出现的
                                if(4==j){
                                    printFunc(y,m,d);
                                }
                            }else{//这个月第一天就是星期1,那第三个星期1,就是第三个星期出现
                                if(3==j){
                                    printFunc(y,m,d);
                                }
                            }
                        } else if (m == 2  && w == 1) {//总统节
                            if(1<tmp){
                                if(4==j){
                                    printFunc(y,m,d);
                                }
                            }else{
                                if(3==j){
                                    printFunc(y,m,d);
                                }
                            }
                        } else if (m == 5  && w == 1) {//阵亡将士纪念日
                            //五月第一天是星期一,最后一个星期一是在 第5个星期
                            //五月第一天是星期日,最后一个星期一是在 第6个星期
                            int k=0;

                            for(int a=0;a<7;a++){
                                if (flg==true){
                                    break;
                                }
                                if(day_of_week(y,5,31-a)==1){
                                    printFunc(y,m,31-a);
                                    flg=true;
                                }
                            }
                        } else if (m == 9 && w == 1) {//劳动节
                            if(1<tmp){
                                if(2==j){
                                    printFunc(y,m,d);
                                }
                            }else{
                                if(1==j){
                                    printFunc(y,m,d);
                                }
                            }
                        } else if (m == 11 && w == 4) {//感恩节
                            if(4<tmp){
                                if(5==j){
                                    printFunc(y,m,d);
                                }
                            }else{
                                if(4==j){
                                    printFunc(y,m,d);
                                }
                            }
                        }
                    }
                    m++;
                }

            System.out.println();
        }
    }
}

发表于 2022-05-10 20:21:51 回复(0)
import java.util.*;
public class Main{
    public static final int arr[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    //判断是否为闰年
    public static boolean isLeap(int n){
        return (((n % 4 == 0 && n % 100 != 0) || n % 400 == 0));
    }
    //给定M-Y-D,返回这一年一共过了多少天
    public static int nDays(int y,int m,int d){
        int n = d;
        for(int i = 0;i < m - 1;i++){
            n += arr[i];
        }
        if(m > 2 && isLeap(y)){
            n++;
        }
        return n;
    }
    //给定M-Y-D,找到从公元前1年12月31日开始过了过久。就出它%7得t同余数
    public static int diff(int y,int m,int d){
        return (y - 1)+(y - 1)/4 - (y - 1)/100 + (y -1)/400 + nDays(y,m,d);
    }
    //根据y-m-d,求出星期几
    public static int week(int y,int m,int d){
        int w = diff(y, m, d) % 7;
        if(w == 0){
            return 7;
        }
        return w;
    }
    //根据1号是星期几,求第n个星期e是几号
    public static int m1(int w,int n,int e){
        return 1 + (n - 1) * 7 + (7 - w + e) % 7;
    }
    //根据6月1号星期w,求5月的最后一个星期一
     public static int m2(int w){
         int d = (w == 1 ? 7 : w - 1);
        return 32 - d;
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int y = sc.nextInt();
        /*
        1月1日:元旦
        * 1月的第三个星期一:马丁·路德·金纪念日
        * 2月的第三个星期一:总统节
        * 5月的最后一个星期一:阵亡将士纪念日
        * 7月4日:美国国庆
        * 9月的第一个星期一:劳动节
        * 11月的第四个星期四:感恩节
        * 12月25日:圣诞节
         */
            System.out.printf("%d-01-01\n",y);
            int w;
            w = week(y,1,1);
            System.out.printf("%d-01-%02d\n",y,m1(w,3,1));
            
             w = week(y,2,1);
            System.out.printf("%d-02-%02d\n",y,m1(w,3,1));
            
            w = week(y,6,1);
            System.out.printf("%d-05-%02d\n",y,m2(w));
            
            System.out.printf("%d-07-04\n",y);
            
             w = week(y,9,1);
            System.out.printf("%d-09-%02d\n",y,m1(w,1,1));
            
             w = week(y,11,1);
            System.out.printf("%d-11-%02d\n",y,m1(w,4,4));
            
            System.out.printf("%d-12-25\n",y);
            
            System.out.println();
        }
    }
}

美国
编辑于 2022-05-10 15:03:38 回复(0)
这什么意思?
发表于 2020-03-30 13:25:40 回复(0)
#include<iostream>
using namespace std;
int main()
{
	int year;
	int month[6] = { 1,2,5,7,9,11 };
	while (cin >> year)
	{
		cout << year << "-" << 0<<1 << "-" << 0<<1 << endl;
		for (int i = 0; i < 6; i++)
		{
			if (month[i] == 7)
			{
				cout << year << "-" << 0<<7 << "-" <<0 <<4 << endl;
				continue;
			}
			int day = 1;
			int c = year / 100;
			int m = month[i];
			int y=year;
			if (month[i] == 1 || month[i] == 2)
			{
				y = year - 1;;
				m += 12;
			}
			y = y % 100;
			int w = (c / 4) - 2 * c + y + (y / 4) + (13 * (m + 1) / 5) + day - 1;
			while (w < 0)
				w += 7;
			w %= 7;
			if (w == 0)
				w = 7;
			if (month[i] != 11)
			{
				if (w != 1)
					day += 8 - w;
				if (month[i] == 1 || month[i] == 2)
					day += 14;
				if (month[i] == 5)
				{
					day += 21;
					if (21 + 7 + 8 - w <= 31)
						day += 7;
				}
			}
			else
			{
				int arr[7] = { 3,2,1,0,6,5,4 };
					day +=arr[w-1];
				day += 21;
			}
			cout << year << "-" ;
            if(month[i]>=1&&month[i]<=9)
                cout<<0;
            cout<<month[i]<< "-";
            if(day>=1&&day<=9)
                 cout<<0;
            cout<< day << endl;
		}
		cout << year << "-" << 12 << "-" << 25 << endl;
	}
	return 0;
}


哪里不对?

发表于 2020-03-02 15:46:33 回复(2)
这是该怎么解决,日期完全错误

发表于 2019-07-10 20:25:57 回复(1)
#include<iostream> #include<vector> using namespace std; vector<int> leap = { 31,29,31,30,31,30,31,31,30,31,30,31 }; vector<int> nor = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//判断闰年 bool isLeap(int year) {  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   return true;  else   return false; }
//判断那一年一月一号据2000年一月一号的天数 int oneDay(int year) {  int days = (year - 2000) / 4 * (365 * 3 + 366);  if ((year - 2000) % 4 == 0)   return days;  else   days += 366 + 365 * ((year - 2000) % 4 - 1);  return days; } //判断几年几月几号是周几 int judge(int year, int mon, int day) {  int days = oneDay(year);  if (isLeap(year))   for (int i = 0; i < mon - 1; i++)    days = days + leap[i];  else   for (int i = 0; i < mon - 1; i++)    days = days + nor[i];  days += day - 1;    int tmp = days % 7;  tmp += 6;  if (tmp > 7)   return tmp - 7;  else   return tmp; } void print(int year, int mon, int day) {  cout << year << '-';  if (mon >= 10)   cout << mon << '-';  else   cout << '0' << mon << '-';  if (day >= 10)   cout << day << endl;  else   cout << '0' << day << endl; }
void Year(int year) {  //元旦  print(year, 1, 1);  //马丁  int t = judge(year, 1, 1);  if (t == 1)   print(year, 1, 15);  else {   int tmp = 7 - t + 2;   tmp += 14;   print(year, 1, tmp);  }  //***  t = judge(year, 2, 1);  if (t == 1)   print(year, 2, 15);  else {   int tmp = 7 - t + 2;   tmp += 14;   print(year, 2, tmp);  }  //阵亡  t = judge(year, 5, 31);  if (t == 1)   print(year, 5, 31);  else   print(year, 5, 31 - t + 1);  //国庆  print(year, 7, 4);  //劳动  t = judge(year, 9, 1);  if (t == 1)   print(year, 9, 1);  else   print(year, 9, 7 - t + 2);  //感恩  t = judge(year, 11, 1);  if (t <= 4)   print(year, 11, 21 + 5 - t);  else   print(year, 11, 7 - t + 1 + 21 + 3 + 1);  //圣诞  print(year, 12, 25); }
int main() {     int year;  while(cin >> year){         Year(year);     }  return 0; }
为什么过不了 自测试了好几个没问题哈
发表于 2019-04-11 13:22:59 回复(2)