如何通过从1开始递增4来获知是否可以获得数字?

时间:2014-02-15 10:54:13

标签: c algorithm

我需要知道是否可以通过迭代递增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)解决方案,我可以做得更好吗?

3 个答案:

答案 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,则表示匹配。