两个大小两个相同的篮球

程序员面试金典(39)
#include &iostream&
#include &stdio.h&
#include &string&
#include &vector&
#include &stack&
#include &sstream&
问题:给定一个正整数,找出与其二进制表示中1的个数相同、且大小最接近的那两个数(一个略大,一个略小)
1110(略小的数) ,10101(略大的数)
10001 , 10100
No Less Number , 1011
关键部分:
1 位运算中关键技巧:
技巧1:以第i位将一个数拆num分上高位部分和低位部分,然后高位部分和低位部分分别进行操作,最后将操作后的高位部分和
低位部分进行或运算,即可得到最终运算结果
低位第i位以下部分全为1的掩模lowMask= 1 && i - 1;
高位第i位及以上部分全为1的掩模highMask = ~( (1 && i) - 1 )
低位lowNum = num & lowMask
高位highNum = num & highMask
技巧2:将数num的第i位变成0:
highMask = ~( 1 && (i + 1) - 1 );注意高位部分的掩模不含第i位本身,则第i位变成0
lowMask= 1 && i - 1; 然后利用技巧1获取高位数和低位数部分进行处理
int lowNumber = num & lowM
int highNumber = num & highM
int result = highNumber | lowN
将数num的第i位变成1:num != (1 && position); 【另第i位变成1】,变为1只需要与2^i进行或运算
将数num的第i位之后全变成0:只需要与一个最后i位都为0,前面都为1的数做与运算
mask = ( (~0) && i )
将数num前面n位设置为1,后面m位设置为0:
先生成n个1,然后向左移动m位
mask = (1 && n) -1;
技巧3:寻找最低位的0:将数num和1做相与运算,如果相与结果为0,则当前位即为所求;否则令num &&= 1,即令数向右移动,之所以不用num与2^i运算,会溢出,
且无法判定何时停止运算
寻找最低位的1:
技巧4:(n & (n-1) ) == 0判断一个整数是否为2的某次方
需要n个1,就 (1 && n) - 1
全是1的数= ~0
判断是否为全是1的数: 将num和1做与运算,如果相与结果为0,肯定不是;否则,令num && = 1,
如果num变成0了,则必定为全1(会溢出,不能用该方法:将该数加1后与2^i比较,当2^i & 该数时,则必定不是全为1)
2 寻找略小的数
考虑到本质上是将一个1变成0,将一个0变成1.
变小,所以改变的1的位置比0的位置要大,所以寻找的应该是类似这种&10&
3 寻找略大的数
那么要改变的0的位置要在1的前面,应该是寻找这种&01&,
寻找到这样的0的位置P:使其右边一位为1,该位置P最小。统计P右侧的0的个数为C0,1的个数为C1。
将P本身变为1,并将P右侧全部清零,P右侧应该存放C1 - 1 个1,并需要将这些1放在离P最远的位置。
例如: 1001110, P = 4,C0=1,C1=3,
将位置P从1变成0,并将P右侧清零得到
将C1+1个1放在P右侧离P最远的的地方得到:1010011
//需要将字符串转化为二进制对应的十进制整数
int toTenSystem(string& num)
if(num.empty())
return -1;
int size = num.size();
int total = 0;
int count = 0;
for(int i = size - 1 ; i &= 0 ; i--)
value = num[i] - '0';
total += value * ( (int) pow(2 , count) );
//判断一个数是不是全为1,比如:111,1111,就返回true: 该数+1后应该等于2^i ,如果不等,继续增加i,如果2^i已经超过整数最大值
bool isAllOnes(int num)
while( ( (num & 1) == 1 ) && ( num != 0 )
num &&= 1;
if(num == 0)
typedef struct Result
Result(bool isResult , int result)
_isResult = isR
统计一个十进制数转换为2进制数中1的个数,统计方法采用:
将该数不断与2^i,进行相与处理,如果相与后结果不为0,表示当前位为1
如果2^i超过最大整数或小于最小整数,则统计停止
int count1(int num)
int count = 0;
//采用num & 1比较, num &&= 1的方法做,不会溢出
while( num != 0 )
if( (1 & num) == 1 )
num &&= 1;
//统计一个整数中0的个数
int count0(int num)
int count = 0;
while( num != 0)
if( ( num & 1)
num &&= 1;
//将十进制整数转换为二进制整数,打印出来
string toBinarySystem(int num)
int total = 0;
int count = 0;
stack&int& stackR
int value = num % 2;
stackResult.push(value);
total += value * ( int( pow(2, count) ) );
}while(num);
while(!stackResult.empty())
int value = stackResult.top();
stackResult.pop();
return ss.str();
//找到类似“01”这种位置,用于找到略大的数
int find01Position(int num)
int value =
int pos = 0;
//必须先找到1
while( value && ( (value & 1) == 0 ) )
value &&= 1;
//说明这个数中没有1,直接返回-1
if(value == 0)
return -1;
//接下来找相邻的0
//pos--;//下面会多计算一次,因此位置要减一
while( value && (value & 1) == 1 )
value &&= 1;
if(value == 0)
return -1;
//找出类似&10&的位置,用于寻找略小的数
int find10Position(int num)
int value =
int pos = 0;
while( value && ( (value & 1) == 1 ) )
value &&= 1;
if(0 == value)
return -1;
while( value && ( (value & 1) == 0 ) )
value &&= 1;
if(0 == value)
return -1;
Result getLessNumber(int num)
int pos = find10Position(num);
if(-1 == pos)
return Result(false , -1);
//统计位置P右侧1的个数
int rightValue = num & ( ( 1 && pos) - 1 );
int countOne = count1(rightValue);
int countZero = pos - countO//0的位置不需要统计,直接拿P-countOne
//将位置P的1变成0,并将P右侧全部变成0
int mask = ~( (1 && (pos + 1) ) -1 );
//将P右侧离P最近的 C1+1个位置全部设置为1 , C1-1个0,组成,总位数就是P,可以先生成C1+1个1
mask = ( 1 && (countOne + 1) ) - 1;
//将这个C1+1个1向左移动C0-1位,使其包含C0-1个0
mask &&= countZero -1;
return Result(true , num);
那么要改变的0的位置要在1的前面,应该是寻找这种&01&,
寻找到这样的0的位置P:使其右边一位为1,该位置P最小。统计P右侧的0的个数为C0,1的个数为C1。
将P本身变为1,并将P右侧全部清零,P右侧应该存放C1 - 1 个1,并需要将这些1放在离P最远的位置。
例如: 1001110, P = 4,C0=1,C1=3,
将位置P从1变成0,并将P右侧清零得到
将C1+1个1放在P右侧离P最远的的地方得到:1010011
Result getGreaterNumber(int num)
int pos = find01Position(num);
if(-1 == pos)
return Result(false , -1);
//计算P位置右侧的1的个数
int rightValue = num & ( (1 && pos) - 1);
int countOne = count1( rightValue );
//找到位置P,将P位置本身变为1
num |= (1 && pos);
//将P位置右侧全部清零,不含P位置
int mask = ~( (1&&pos) - 1);
//从P右侧,离P最远的C1 - 1个0全部变成1,记住:需要n个1,就 (1 && n) - 1
num |= ( (1 && countOne - 1) - 1
return Result(true , num);
void process()
while(cin && sNum)
num = toTenSystem(sNum);
//转化为十进制整数后,下面就是移位
Result lessResult = getLessNumber(num);
Result greaterResult = getGreaterNumber(num);
if(lessResult._isResult)
cout && toBinarySystem(lessResult._result) && & ,&;
cout && &No Less Number ,& ;
if(greaterResult._isResult)
cout && toBinarySystem(greaterResult._result) &&
cout && &No Greater Number& &&
int main(int argc, char* argv[])
process();
getchar();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:187739次
积分:6505
积分:6505
排名:第2882名
原创:467篇
转载:80篇
评论:16条
(12)(28)(3)(2)(18)(11)(1)(9)(1)(8)(3)(4)(23)(12)(268)(32)(5)(6)(13)(1)(4)(74)(9)(1)(2015秋o银川校级月考)两个大小相同的、带电量也相同的小球A和B,分别固定在两处,两球间相互作用力为F,用一个不带电_答案_百度高考
物理 库仑定律...
(2015秋o银川校级月考)两个大小相同的、带电量也相同的小球A和B,分别固定在两处,两球间相互作用力为F,用一个不带电的同样大小的小球C先和A接触再和B接触,然后移去C,则AB间作用力变为(  )
第-1小题正确答案及相关解析您的举报已经提交成功,我们将尽快处理,谢谢!
以下讨论都是在该正方形的平面内进行的:
首先连接两条对角线,得到交点O,过O做任意一条直线L1,交正方形于两点A',B',然后再通过O做L1的垂线L2,交正方...
集合可以分为两种:有序集与无序集。
自然数集、有理数集、实数集都是有序集,即对这个集合里任意两个元素,我们可以规定它们的先后次序。在有序集上,我们可以根据元素...
正方体的棱长=96/16=6
原来正方体的体积=6*6*6=216
表面积=6^2*6=216
把一对边三等分,连接相对(类似对角线)的等分点
每个小长方形的边长分别是10和5厘米,所以其周长都是30厘米。
答: 到该来下次大姨妈的时候再测测,早上起来的晨尿比较准,而且有一些试纸十天内的早早孕是测不出来的,别急
大家还关注2013年12月 C/C++大版内专家分月排行榜第二2013年12月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 C/C++大版内专家分月排行榜第二2013年10月 C/C++大版内专家分月排行榜第二
2014年2月 C/C++大版内专家分月排行榜第二2013年4月 C/C++大版内专家分月排行榜第二2013年3月 C/C++大版内专家分月排行榜第二2012年12月 C/C++大版内专家分月排行榜第二2012年11月 C/C++大版内专家分月排行榜第二2012年8月 C/C++大版内专家分月排行榜第二
2014年12月 C/C++大版内专家分月排行榜第三2014年5月 C/C++大版内专家分月排行榜第三2014年3月 C/C++大版内专家分月排行榜第三2013年12月 C/C++大版内专家分月排行榜第三2013年10月 C/C++大版内专家分月排行榜第三2013年9月 C/C++大版内专家分月排行榜第三2013年7月 C/C++大版内专家分月排行榜第三2013年5月 C/C++大版内专家分月排行榜第三2013年2月 C/C++大版内专家分月排行榜第三2013年1月 C/C++大版内专家分月排行榜第三2012年9月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。两个不一样重量、不一样大小。但是一样的材... | 问答 | 问答 | 果壳网 科技有意思
两个不一样重量、不一样大小。但是一样的材质的东西为什么同时着地?
两个不一样重量、不一样大小。但是一样的材质的东西为什么同时着地?
我是个初中生。没有学那个物理,我不知道。求高人解释。。
+ 加入我的果篮
死理,数学,程序,动漫控
落地时间只和高度还有重力加速度有关,在不计空气阻力的情况下
实验证明:比萨斜塔实验理论证明:按照亚里士多德的说法,重的物体比轻的物体下落的快。那么假设有一个重的和一个轻的物体,重的下落用5s,轻的下落10秒。如果把他们用绳子连起来,重的被轻的牵制,运动变慢,轻的被重的拉着,运动变快,那么他们下落的时间应该大于5s小于10s。如果把他们看成一个整体,这个整体的重量应该比其中任意一个都要重,按照亚里士多德的理论,这个整体下落时间应小于5s。所以这两种情况是矛盾的。即重的物体和轻的物体下落的一样快。
有个悖论可以参考:
有A球10斤,B球1斤。
假设:A比B重而且大应该比B落得快些。如果两球绑在一起的话,由于B比A要落得慢所以B会拉着A,这样的话绑在一起的两个球会落得比单独的A球慢。
但是把绑在一起的两个球看成一个整体的话他们的重量是11斤应该落得比单独的A更快些。
以上两个结果矛盾所以只能是一起落地了。
天文学博士,出版社编辑,科学松鼠会成员
不考虑空气阻力,称为理想情况,落体只受到重力影响,下落速度是一样的。这一点在真空管实验或月球实验中,羽毛和铁球下落速度一致,已经证明过了。对于这类问题,重要的是区分多种不同力的本质,而日常经验里面很难做到这一点,所以学习科学还是很重要的,有助于我们看清这个世界的真相。
你觉得为什么不能同时着地呢?可以从这个角度来考虑下。
初中生的话,这个是考试的要点吧,你们老师没讲关于空气阻力的事情?不同时落地的原因是因为有空气阻力。
惯性质量等于引力质量
初中一般都不计空气的,所以物体落地的时间只与重力加速度和高度有关,在同一地点其重力加速度一定的,同高度落下的话,它们会同时落地。。。
我来讨论有空气阻力的情况,如果是相同材质,比如都是铁球,大小不同的话空气阻力也不同,大的重量大,空气阻力也大,那么到底哪个落得快呢?实际上重量和尺寸的三次方成比例(体积),而空气阻力和尺寸的平方成比例(迎风面积),所以总的来说,还是大的下落速度快一些,从这点上来说,亚里士多德说的没错。这也解释了沙尘为什么可以浮在空中的原理,只要足够小,很小的下落速度就可以让空气阻力大到与重力相当的地步。
前提还要忽略 阻力
那只能在理想环境下
All's right with the wor...
因为 A的质量是B的2倍。所以在同一位置同样的高度,A受到的重力是B的2倍。因为 A的质量是B的2倍。所以当同样的力施加于A时,[改变运动状态]的效果是B的一半。抵消了。
补充一句,如果忽略空气阻力的话,材料是否一样也无所谓。忽略阻力,那么它只受重力。速度=加速度×时间(v=at) =重力/质量×时间(v=G/m×t)=质量×重力加速度/质量×时间(常数,≈9.8牛每二次方秒)=9.8(牛每二次方秒)×t(秒)
电力电子博士生,文史爱好者
与材质没有关系的。自己领悟去吧。
后回答问题,你也可以用以下帐号直接登录
(C)2016果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:

我要回帖

更多关于 两个相同的篮球 的文章

 

随机推荐