题目:

  不使用/,%,+和*,如何判断一个数能否被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

相关文章:

  • 2021-12-06
  • 2021-08-28
  • 2022-02-18
  • 2021-07-06
  • 2021-06-07
  • 2022-12-23
  • 2022-12-23
  • 2021-06-18
猜你喜欢
  • 2021-08-22
  • 2021-11-21
  • 2021-08-26
  • 2022-02-11
  • 2022-12-23
  • 2021-10-17
  • 2022-01-18
相关资源
相似解决方案