C语言每日一题——第二天
第二天
题目
小明在完成给朋友统计生日的代码之后,想起来他好像看到过有一个数学公式是用于计算某年某月某日是星期几。当然了,他不会无聊到用这个程序计算超过700年前的星期。
执行:$ main.exe U V I ]
输出:
2022-9-29: 4
输入
程序通过命令行参数输入获取参数,参数格式为世纪 不含世纪的年份 月份 日期
。
为了方便输入,将数字统一移动64个,即 ASSCII 码表为 65 的符号(即A
)代表数字1。
输出
程序首先以减号为分隔输出用于计算的年
、月
、日
,冒号后输出星期。
关键
信息检索能力,C程序数学公式构建能力,强制类型转换。
更多示例:
$ ./main.exe U @ A C
2000-1-3: 1
$ ./main.exe U C B S
2003-2-19: 3
$ ./main.exe T x J J
1956-10-10: 3
解答
题目暗示的公式是蔡勒(Zeller)公式,可以看这篇文章了解:https://www.cnblogs.com/faterazer/p/11393521.html。
#include <stdio.h>
#include <iso646.h>
int main(int cnt, char **argv) {
int century, year_without_century, month, day, week;
// 获取输入的日期
if (cnt not_eq 5) {
// 第一个参数是获得的参数数量, 若数量不正确, 说明输入错误, 这时程序打印错误停止运行, 返回 -1
printf("Input value error!\n");
// 函数在运行到 return 后便会退出, 不会运行之后的代码
return -1;
}
// 获取用于计算的日期
century = (int) (*argv[1]) - 64;
year_without_century = (int) (*argv[2]) - 64;
month = (int) (*argv[3]) - 64;
day = (int) (*argv[4]) - 64;
century -= 1; // 事实上在计算后 "century" 就不再代表“世纪“了
printf("%d%02d-%d-%d", century, year_without_century, month, day);
// 公式运算
if (month == 1 or month == 2) { // 处理月份
year_without_century -= 1;
if (year_without_century < 0) {
year_without_century = 99;
century -= 1;
}
month += 12;
}
// 因为公式太长,被我分为了两段
week = (int) (century / 4) - 2 * century + year_without_century + (int) (year_without_century / 4);
week = week + (int) ((13 * (month + 1)) / 5) + day - 1;
while (week < 0){
week += 7;
}
week %= 7;
// 打印结果
printf(": %d\n", week);
return 0;
}