c - 我怎么知道一个数字是否可以从1开始递增4?

标签 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) 解决方案,我可以做得更好吗?

最佳答案

显然,您要检查数字 n 是否具有以下形式

n = 1+4k

所以你只需要检查它的前身是否能被 4 整除。

如果你有二进制 2 的补码,如果最后 2 位为 0,则属于后者。

因此:

int check(int n) { return (n-1)&3 == 0; }

为了让帽子更短,1+4k 形式的数字的最后两位为 s01:

    int check(int n) { return n&3 == 1; }

关于c - 我怎么知道一个数字是否可以从1开始递增4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21796537/

相关文章:

algorithm - 访问无向图中的边、顶点

c - 将表示有符号整数的字节数组转换为整数的公式

java - Java 和 JNI (dll) 之间的索引越界异常

c - 如何生成如下所示的输出?

algorithm - 算法。添加两个n位二进制数。这个问题的循环不变性是什么?

重新排列简单符号代数表达式的算法

c - 数组指针 while 循环输入

objective-c - 立即停止应用程序执行

algorithm - 字符串中子串的个数 : n-squared or exponential

c++ - 从可用数字中形成最大数字?