嗨,这是一个面试问题。
对于任何给定的数字,计算可被8整除的下一个数字。
即。如果给定的数字是43
,我们的算法应该生成48
作为结果。如果数字已被8
整除,则应显示Number already divisible by 8
并生成可被8整除的下一个数字。
我建议他们可以被8
整除的任何数字的最后三位为0
(LSB + 2,LSB + 1,LSB)。但我无法给出确切的解决方案。
我说的是解决这个问题的正确方法,还是我们可以寻求更智能的解决方案? 我需要通过位操作来做到这一点。
答案 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);
}
}
你可以试试这个解决方案之一
三江源。