泽勒全等编码,输出错误的一天
Zeller's congruence coding, outputing wrong day
#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, 2000
和March 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;
}
相关文章:
- 输出错误,问题是找到总和5000位数字cpp
- 使用复制构造函数的程序输出错误
- 异或字符串加密/解密输出错误
- 在linux上使用g++输出错误,在windows上更正
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- ECDSA 密钥对生成输出错误
- fscanf() 输出错误的值
- 输入 1024 后十进制到二进制转换的输出错误?
- 输出错误命令的条件语句
- cuSparse (cusparseDcsrgemm) 中的矩阵乘法输出错误的结果
- 为什么 du -sh 输出错误大小的内存映射文件
- VS2017 的输出错误,但 mingw 有效
- 如何使FFMPEG C 代码不输出错误消息
- 乘以时输出错误.这是我编译器中的错误吗?C
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 为什么输出错误崩溃
- C++输入/输出错误
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- 当我使用此合并排序代码运行时,输出错误
- 递归功能输出错误的值