我有一个我见过的最奇怪的练习:我必须通过在控制台中扫描年份来找到闰年,并控制它是否是闰年。
我只能使用+ -/* %
作为算术运算符;我不允许使用任何其他运算符或函数。
这是我目前所拥有的:
int year = 0;
bool b = false;
printf ("Type in a year: ");
int helpVar = 1000;
for (int i = 0; i < 4; i++) {
year += (getchar() - '0') * helpVar;
helpVar = helpVar / 10;
}
b = (((year % 4) + (year % 100) + (year % 400)) + 1) % 2;
所以我不明白我在这里做错了什么。到目前为止它有效,唯一让我害怕的是“1900”年。根据我的代码,它不应该是闰年,但似乎是闰年。
我在这里错过了什么?
最佳答案
这是一种可能性(也许不是最短的——显然只适用于公历):
b = (((year-1)%4)+1)/4 - (((year-1)%100)+1)/100 + (((year-1)%400)+1)/400;
只有当 year
是 的倍数时,
(对于正 ((year-1) % n) + 1
才等于 n
>nyear
),否则小于 n
。因此,如果将其除以 n
,当且仅当 (year % n == 0)
时,您得到 1
。
因为如果 year%4==0
不是,year%100==0
就不可能是 true,所以您可以将它们相互减去,但是添加 year%400==0
学期末。
关于c - 闰年 - 仅使用 C 中的算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66568146/