如何解决闰年 - 仅在 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) + 1
是 n
的倍数时 year
才等于 n
(对于正 year
),并且小于 {{ 1}} 否则。因此,如果将其除以 n
,则当且仅当 n
。
因为如果 1
不是,则 (year % n == 0)
不能为真的,您可以将其相减,但在末尾添加 year%100==0
项。
问题在于您的 %
运算是以整数算术完成的,因此,它们的结果很可能是除 0
或 1
之外的值.但是,如果您将这些结果中的每一个都转换为 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 == 0
是n
的倍数或400
不是n
的倍数
问题是您不应该将所有这三个条件都写为加法操作。你应该把它们写成逻辑表达式。
在您的代码中:
b = (((年 % 4) + (年 % 100) + (年 % 400)) + 1) % 2;
有3个条件,100
、year % 4
和year % 100
,求值后有两种方法使b=true:
- 三个条件都为假
- 只有一种情况是假的
好吧,让我们说清楚
闰年的定义:
-
year % 400
是 4 的倍数而不是 100 的倍数 -
n
是 400 的倍数
所以你的代码可以是这样的:
n
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。