泽勒全等编码,输出错误的一天

Zeller's congruence coding, outputing wrong day

本文关键字:输出 错误 一天 编码      更新时间:2023-10-16
#include <iostream>
#include <string>
using namespace std; 

void dayofweek(int &m, int d, int y);
int main()
{
int m, d, y, daynum; 
char ans;
do {
cout << "Enter a date as mm dd yyyy: n";
cin >> m >> d >> y; 
dayofweek(m, d, y);
cout << m << d << y;
daynum=(d + 5 + ((26*(m+1))/10) + ((5*(y%100))/4) + ((21*(y/100))/4) )%7;
cout << daynum;

switch(daynum)
{
    case 0:
        cout << m << "/" << d << "/" << y << "is a Monday n";  
        break;
    case 1:
        cout << m << "/" << d << "/" << y << "is a Tuesday n"; 
        break; 
    case 2:
        cout << m << "/" << d << "/" << y << "is a Wednesday n";
        break;
    case 3:
        cout << m << "/" << d << "/" << y << "is a Thursday n";
        break;
    case 4:
        cout << m << "/" << d << "/" << y << "is a Friday n";
        break;
    case 5:
        cout << m << "/" << d << "/" << y << "is a Saturday n";
        break;
    case 6:
        cout << m << "/" << d << "/" << y << "is a Sunday n";
        break;
}
cout<<"Do you want to continue? (y/n) n"; 
cin >> ans; 
}while (ans == 'y' || 'Y');
return 0;
}
void dayofweek(int& m, int d, int y) 
{
    if (m==1 || m==2)
    m=m+12;
}

这可以编译并正常工作,但是当我输入日期时,会出现错误的工作日。

例如,2014 年 2 月 28 日是星期五,但星期六出现。有什么建议吗?我被困在要改变什么上,我也检查了很多次方程式。

在泽勒的全等实现结果中意味着:0 = Saturday, 1 = Sunday, 2 = Monday ...您使用的公式还需要更改dayofweek函数并更改处理年份。我决定放弃这个dayofweek函数,改为引入dayNumber

将此更改应用于 switch 语句和函数后,我得到了维基百科示例的正确结果,用于January 1, 2000March 1, 2000。同样对于您的2 28 2014输入,我得到Friday正确答案。

更改的代码:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int dayNumber(int m, int d, int y) {
    if (m == 1 || m == 2) {
        m = m + 12;
        y = y - 1;
    }
    return (d + (int)floor((13 * (m + 1)) / 5) + y%100 + (int)floor((y%100)/ 4) + (int)floor(((int)floor(y/100))/4) + 5*(int)floor(y/100)) % 7;
}
int main() {
    int m, d, y, daynum;
    char ans;
    do {
        cout << "Enter a date as mm dd yyyy: n";
        cin >> m >> d >> y;
        daynum = dayNumber(m, d, y);
        cout << "daynum:" << daynum << "t";
        switch (daynum) {
            case 2:
                cout << m << "/" << d << "/" << y << " is a Monday n";
                break;
            case 3:
                cout << m << "/" << d << "/" << y << " is a Tuesday n";
                break;
            case 4:
                cout << m << "/" << d << "/" << y << " is a Wednesday n";
                break;
            case 5:
                cout << m << "/" << d << "/" << y << " is a Thursday n";
                break;
            case 6:
                cout << m << "/" << d << "/" << y << " is a Friday n";
                break;
            case 0:
                cout << m << "/" << d << "/" << y << " is a Saturday n";
                break;
            case 1:
                cout << m << "/" << d << "/" << y << " is a Sunday n";
                break;
        }
        cout << "Do you want to continue? (y/n) n";
        cin >> ans;
    } while ((ans == 'y') || (ans == 'Y'));
    return 0;
}