Adobe--Without using /,% ,+and * operators. write a function to check whether a number is divisible by 3 or nor?

 

题目:

  不使用/,%,+和*,如何判断一个数能否被3整除

 

解答:

  关键提示:

    如果n的二进制末位为0,那么n和n>>1同时被3整除或者不整除

    如果n的二进制末位为1,那么n和(n>>1)-1同时被3整除或者不整除

 

 1 bool IsTimesOf3(int n)  
 2 {  
 3     int lastPosition;  
 4     if (n < 0)  
 5         n = - n;  
 6     while (n > 0)  
 7     {  
 8         lastPosition = n & 1;  // 0 or 1
 9         n >>= 1;  
10         n = n - lastPosition;  // -0 or -1
11     }  
12     return (n == 0);  // yes when n%3 == 0 ,else here n < 0
13 }

 

 

下面摘抄一段别人对上面提示的解释:

  n的二进制末尾为0 为偶数 假设n=2k;又因为 n能被3整除 所以 n=2*3K=6k;那么 n右移1位 相当于除以2 那么 n=n/2;n=3k ;3K一定会整除3; (不能整除 同理可得 即 n=3k+1);

  如果n二进制末尾为1,那么是奇数 n=2k+1;又因为n可以被3整除,那么n=3*(2k+1); n右移1位,再减去1.就等于 3k,3k必然能被3整除(不能整除 同理可得)

 

 

摘自:http://page.renren.com/601284443/note/819990632

posted @ 2012-04-15 00:17  ziyoudefeng  阅读(1098)  评论(0编辑  收藏  举报