格里高利历。如何找星期一?

时间:2013-07-03 15:51:57

标签: c

你们中的任何人都可以帮助我解决它的逻辑吗? 根据格里高利历,这是星期一01 01 01.如果任何一年通过键盘输入一个程序,找出今年1月1日的那一天。

2 个答案:

答案 0 :(得分: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格式返回日期,其中Monday == 1和Sunday == 7

答案 1 :(得分:-1)

程序的工作原理:

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

    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");
    }