微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决闰年 - 仅在 C 中使用算术运算符

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

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

这是我目前所拥有的:

   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-1) % n) + 1n 的倍数时 year 才等于 n(对于正 year),并且小于 {{ 1}} 否则。因此,如果将其除以 n,则当且仅当 n

因为如果 1 不是,则 (year % n == 0) 不能为真的,您可以将其相减,但在末尾添加 year%100==0 项。

,

问题在于您的 % 运算是以整数算术完成的,因此,它们的结果很可能是除 01 之外的值.但是,如果您将这些结果中的每一个都转换为 bool 类型(假设它在 <stdbool.h> 标头中定义),那么您的公式将起作用:

    b = (((bool)(year % 4) + (bool)(year % 100) + (bool)(year % 400)) + 1) % 2;

我对您的代码所做的唯一修改是在每个 (bool) 操作的结果上添加 % 强制转换。


编辑:正如评论中所指出的,上述解决方案通过使用强制转换运算符“打破了规则”。以下修改也有效(以类似方式),但它对每个 ! 结果使用 % 运算符(两次);这也违反了规则,但可能对后代有益:

    b = ((!!(year % 4) + !!(year % 100) + !!(year % 400)) + 1) % 2;

仅使用对 bool隐式类型转换(因此不使用强制转换运算符)来修改此解决方案似乎符合规则。这可以使用临时/中间变量来保存每个 % 操作的结果:

    bool four = year % 4,hundred = year % 100,fourhund = year % 400;
    b = (four + hundred + fourhund + 1) % 2;

或者,您可以预先声明三个中间 bool 变量,然后“内联”执行这些隐式类型转换,如下所示:

    bool m4,m100,m400; // You could also move this to where you declare "b"
    b = (((m4 = year % 4) + (m100 = year % 100) + (m400 = year % 400)) + 1) % 2;
,

从上面的帖子来看,import React,{ useEffect,useRef } from 'react'; export function useInterval(callback,delay) { const savedCallback = useRef(); // Remember the latest callback. useEffect(() => { savedCallback.current = callback; },[callback]); // Set up the interval. useEffect(() => { function tick() { savedCallback.current(); } if (delay !== null) { let id = setInterval(tick,delay); return () => clearInterval(id); } },[delay]); } 的定义是:对于 leap year

  • n 应该是 4 的倍数,可以表示为 n
  • n % 4 == 0n 的倍数或 400 不是 n 的倍数

问题是您不应该将所有这三个条件都写为加法操作。你应该把它们写成逻辑表达式。

在您的代码中:

b = (((年 % 4) + (年 % 100) + (年 % 400)) + 1) % 2;

有3个条件,100year % 4year % 100,求值后有两种方法使b=true:

  • 三个条件都为假
  • 只有一种情况是假的

好吧,让我们说清楚

闰年的定义:

  • year % 400 是 4 的倍数而不是 100 的倍数
  • n 是 400 的倍数

所以你的代码可以是这样的:

n

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。