找到下一个数字除以8?

时间:2013-07-30 11:12:05

标签: c algorithm bit-manipulation

嗨,这是一个面试问题。

对于任何给定的数字,计算可被8整除的下一个数字。

即。如果给定的数字是43,我们的算法应该生成48作为结果。如果数字已被8整除,则应显示Number already divisible by 8并生成可被8整除的下一个数字。

我建议他们可以被8整除的任何数字的最后三位为0(LSB + 2,LSB + 1,LSB)。但我无法给出确切的解决方案。

我说的是解决这个问题的正确方法,还是我们可以寻求更智能的解决方案? 我需要通过位操作来做到这一点。

5 个答案:

答案 0 :(得分:8)

你走在正确的轨道上。

int next8(int n) {
    int bits = n & 7; // give us the distance to the previous 8
    if (bits == 0) printf("Number already divisible by 8");
    return n + (8-bits);
}

(注意:我讨厌那些应该是纯粹打印的功能,但任务要求如此。抱歉。)

答案 1 :(得分:8)

next = current + 8 - (current % 8)

答案 2 :(得分:2)

使用while循环很容易:

if number % 8 == 0
  already divisible by 8

while number % 8 != 0
  ++number

这是O(1),因为8是常数,但我们可以使用以下公式做得更好:

if number % 8 == 0
  already divisible by 8

number = number + 8 - number % 8

答案 3 :(得分:0)

您的检查是正确的,要检查它您可以使用7执行按位AND并确保它为0(X& 7 == 0)。 要获得下一个数字 - 向右移3,加1并向后移(((X>> 3)+ 1)<< 3)

答案 4 :(得分:0)

void main()
{
   int n;
   printf("\n Enter the number:");
   scanf("%d",&n);
   if(n==8 && n%8==0)
   printf("%d it is already divisible by 8",n);
   else
   {
      printf("not divsible by 8 so nearest number is:");
      i=n/8;
      i++;
      n=i*8;
      printf("%d is next number divisible by 8",n);         
   }
}

你可以试试这个解决方案之一

三江源。