c - 闰年 - 仅使用 C 中的算术运算符

标签 c leap-year

我有一个我见过的最奇怪的练习:我必须通过在控制台中扫描年份来找到闰年,并控制它是否是闰年。

只能使用+ -/* % 作为算术运算符;我不允许使用任何其他运算符或函数。

这是我目前所拥有的:

   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 >n(对于正 year),否则小于 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/

相关文章:

c - 错误: (FILE *) 'fp' was not declared in this scope

c - 将 Fortran/C 程序从 32 位升级到多体系结构

c++ - 理解指针和本地范围

c - stat 函数在多次调用时不会改变它的值

algorithm - 计算闰年中的两个日期之间的天数

java - 为什么我的闰年算法不起作用(Java)?

c - gsl akima 样条的插值误差

statistics - 在比较年度销售额时计算闰年

javascript - JS - 考虑闰年计算两个日期之间的天数

c# - 如何在 C# 中使用 AddYears 方法获取 2 月 29 日