我需要知道是否可以通过迭代递增1到4来获得数字。这些数字是5,9,13,17,21等。为此,我现在正在做以下事情:
#include <stdio.h>
int main() {
int number = 13;
int i;
for (i = n; i > 0; i -= 4) {
if (i == 1) {
printf("yes\n");
break;
}
}
if (i <= 0)
printf("no\n");
}
但这似乎是非常低效的O(n)方法。我会很感激O(1)解决方案,我可以做得更好吗?
答案 0 :(得分:5)
显然,您要检查数字n
的格式是否为
n = 1+4k
所以你只需要检查它的前任是否可被4整除。
如果你有二进制2的补码数,如果最后2位是0,后者就是这种情况。
因此:
int check(int n) { return (n-1)&3 == 0; }
为了让帽子变得更短,1+4k
形式的数字将最后两位变为s 01
:
int check(int n) { return n&3 == 1; }
答案 1 :(得分:4)
您可以使用模数运算符:
if ( num % 4 == 1 ) printf("yep")
;
答案 2 :(得分:1)
减去1并将模除法除以4.如果结果为0,则表示匹配。