经典算法之英文日期问题

发布时间 2024-01-06 15:06:06作者: 神奇的萝卜丝

这题其实就是多了一个字符串转化成数字而已。

用一个字符串数组和字符串比较函数就可以得出数字月份然后就简单了。

然后最后一个难点就是确定是星期几,可以根据今天的日期的星期当作固定点,找相差几天然后得出具体星期。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int change(char M[]) {
    char G[12][15]={
            "January", "February", "March", "April", "May", "June","July", "August",
            "September", "October","November", "December"
    } ;
    int i = 0 ;
    for ( ; i <= 11 ; i++ ) {
        if( strcmp(G[i],M) == 0 ){
            break;
        }
    }
    return i+1 ;
}
void print(int i) {
    char A[7][10]={
            "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
    } ;
    printf("%s\n", A[i] ) ;
}
void swap (int* x, int* y ){
    int t = *x ;
    *x = *y ;
    *y = t ;
}
int main( ) {
    int year = 0 , day = 0 ;
    int A[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;
    char M[15] ={'\0'} ;
    while(scanf("%d %s %d",&day,M,&year) != EOF ) {
        int mouth = change(M) ;
        int gap = 0 ;
        int tem = 2024 ;
        int flag = 0 ;
        int i = 1 ;
        int j = 6 ;
        if ( tem > year ) {
            swap( &tem,&year ) ;
            swap( &i , &mouth ) ;
            swap( &j , &day ) ;
            flag = 1 ;
        }
        while( tem != year || i != mouth || j != day ) {
            bool judge = tem % 400 == 0 || tem % 100 != 0 && tem % 4 == 0 ;
            if(judge){
                A[2] = 29 ;
            }else{
                A[2] = 28 ;
            }
            if(j <= A[i] ) {
                j++ ;
                gap++ ;
            }else{
                j = 1 ;
                i++ ;
                if( i == 13 ) {
                    tem++ ;
                    i = 1 ;
                }
            }
        }
        gap %= 7 ;
        int x = 6 ;
        if( flag == 1 ) {
            x = (6 - gap + 7 ) % 7 ;
        }else{
            x = (6 + gap + 7 ) % 7 ;
        }
        flag = 0 ;
        print( x ) ;
    }
    return 0 ;
}

结果如下: