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

本文介绍了一种不使用传统算术运算符来判断一个整数是否能被3整除的方法。通过位操作和简单的数学变换实现了这一目标,提供了一个创新且高效的解决方案。

 

题目:

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

转载于:https://www.cnblogs.com/ziyoudefeng/archive/2012/04/15/2447871.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值