7-11 h0264. 日历2

7-11 h0264. 日历2
分数 10
作者 黄正鹏
单位 贵州工程应用技术学院
现在使用的日历是从古罗马时期演变来的。Julius Caesar编纂了日历系统,后来被称为Julius历。在这个日历系统中,4月、6月、9月和11月有30天;非闰年的2月有28天,闰年的2月则有29天;其他月份有31天。此外,在这个日历系统中,闰年是每4年1次。这是因为古罗马的天文学家计算出1年有365.25天,因此在每4年之后,需要添加额外的一天以保持季节的正常。为此,每4年要在一年中增加额外的一天(2月29日)。
Julian规则:如果年份是4的倍数,则该年是闰年,即有额外的一天(2月29日)。
在1582年,罗马教皇Gregory的天文学家们注意到,该年不是365.25天,而是接近365.2425天。因此,闰年的规则被修订。
Gregorian历(公历)规则:年份是4的倍数是闰年,但如果这一年是100而不是400的倍数,则不是闰年。
为了弥补在那个时候已经造成的季节与日历的差异,日历被挪后了10天:在第二天,1582年10月4日被宣布为10月15日。
大英帝国(当然,那时还包括美国)当时没有改用公历,一直到1752年,才将9月2日被宣布为9月14日。(延迟改变的原因是亨利八世和教皇的关系恶劣。)
请您编写一个程序,对美国使用日历的日期进行转换,并输出是星期几。
输入格式:
输入是一个大于零的正整数序列,每行3个代表日期的整数,一个日期一行。日期的格式是“月 日 年”,其中月是1至12的正整数(1表示1月,12表示12月,等等),日是一个1至31的正整数,而年则是一个正整数。

输出格式:
输出按照样例输出中给出的格式给出输入的日期和星期几。在美国使用的日历中无效的日期或不存在的日期则要输出一个指出无效日期错误消息。输入以三个0结束。

输入样例:
11 15 1997
0 0 0
输出样例:
November 15, 1997 is a Saturday

#include <stdio.h>

int main() {
    int month, day, year;
    int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char *months[] = {"January", "February", "March", "April", "May", "June", 
                      "July", "August", "September", "October", "November", "December"};
    char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    while (1) {
        scanf("%d %d %d", &month, &day, &year);
        if (month == 0 && day == 0 && year == 0) {
            break;
        }

        // Check for invalid dates
        if (month < 1 || month > 12 || day < 1 || day > days_in_month[month - 1] ||
            (day == 29 && month == 2 && (year % 4 != 0 || (year % 100 == 0 && year % 400 != 0)))) {
            printf("Invalid date\n");
        } else {
            // Calculate day of the week
            int total_days = 0;
            for (int i = 1; i < year; i++) {
                if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) {
                    total_days += 366;
                } else {
                    total_days += 365;
                }
            }
            for (int i = 1; i < month; i++) {
                total_days += days_in_month[i - 1];
                if (i == 2 && (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) {
                    total_days++;
                }
            }
            total_days += day - 1;
            printf("%s %d, %d is a %s\n", months[month - 1], day, year, days[total_days % 7]);
        }
    }

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7798335
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^