-5

你们中的任何人都可以帮助我了解其逻辑。根据公历,01 01 01 是星期一。如果通过键盘输入任何年份,请编写程序找出今年 1 月 1 日是哪一天。

4

2 回答 2

2

您正在寻找Zeller's Congruence,它将告诉您任何给定日期的星期几。

它看起来像这样:

int getDayOfWeek(int day, int month, int year) {

    int aa = (14 - month) / 12;
    int yy = year - aa;
    int mm = (month + (12 * aa)) - 2;

    int dayOfWeek = (day + yy + (yy / 4) - (yy / 100) + (yy / 400) + ((31 * mm) / 12)) % 7;

    return ((dayOfWeek + 6) % 7) + 1;
}

该函数以 ISO 格式返回日期,其中星期一 == 1 和星期日 == 7

于 2013-07-03T15:54:54.103 回答
-1

该程序是如何工作的:

  • 首先我们要求用户输入任何年份(yr)
  • 我们被要求找到 1 月 1 日,这意味着我们只需要上一年的最后日期。假设我们需要找到 2010。我们可以在从 1900 到 2009+1 的这一天的天数中找到它。希望你现在明白了。我们不需要输入年份的全部天数。
  • 然后我们找到参考年份(1900 或 byr)之间的差异
  • 然后我们找到没有。闰年除以 4(lp)
  • 然后我们找到中间有多少正常年(rem)
  • 然后我们计算总天数 365*正常天数+366*无。闰年+1 我们添加了 1,因为我们必须为 1 月 1 日而不是 12 月 31 日找到。
  • 然后我们从总天数和休息时间中找到余数,您可以理解
  • 我发现了几个代码,但都令人困惑,所以我创建了一个简单且有效的代码。
  • 例如,用户输入 2010=>2009=>2009-1900=>109=>27 闰年和正常年份。乘以 366 与否。闰年和正常年份的 365 年并在末尾加 1(查找 2010 年 1 月 1 日) 使用模运算符,您将得到编号。1 月 1 日在 week.0==monday,1==tuesday,3==wed 等等。

    main(){
    int yr,byr=1900,lp,rem,td,day;
    printf("Enter year:");
    scanf("%d",&yr);
    yr=(yr-1)-byr;
    lp=yr/4;
    rem=yr-lp;
    td=(rem*365)+(lp*366)+1;
    day=td%7;
    if (day==0)
        printf("Monday");
    else if (day==1)
        printf("Tuesday");
    else if (day==2)
        printf("Wednesday");
    else if (day==3)
        printf("Thursday");
    else if (day==4)
        printf("Friday");
    else if (day==5)
        printf("Saturday");
    else if (day==6)
        printf("Sunday");
    }
    
  • 于 2013-10-26T04:43:43.507 回答