面试题 求助 高手请进!!!

龙胜LONGAIN 2012-02-28 03:25:41
有一种小虫,每隔两秒钟分裂一次。分裂后的两只新的小虫经过两秒钟后又会分裂。如果最
初某瓶中只有一只小虫,那么两秒后变两只,再过两秒后就变四只……两分钟后,正好满满
一瓶小虫。现在这个瓶内最初放入两只这样的小虫。

问:经过多少时间后,正巧也是满满的一瓶?

那位高手帮忙给个解题思路和Java解题算法代码。
...全文
2766 82 打赏 收藏 转发到动态 举报
写回复
用AI写文章
82 条回复
切换为时间正序
请发表友善的回复…
发表回复
beannian 2012-03-07
  • 打赏
  • 举报
回复
处理16位以上的有效位用BigDecimal,这是考点应该,答案不重要
Papaver 2012-03-07
  • 打赏
  • 举报
回复
第一次是1*2*2*2*2*2……
第二次是2*2*2*2*2*2……
每乘一次花费的时间是2秒,同样的量少乘一次2说明少用两秒。
他们考得应该就是基本数据类型的最大值,用int肯定不行。就是判断long是否可以。
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1。
这次运算最大的是2的60次方,所以用long应该可以。
码无边 2012-03-07
  • 打赏
  • 举报
回复
智力题
zuobangning 2012-03-06
  • 打赏
  • 举报
回复
一只变成两只的时候话了两秒钟,那么从两只开始的时候就减去开始的两秒不就好了啊!正解就是118秒
zuobangning 2012-03-06
  • 打赏
  • 举报
回复
一只变成两只的时候话了两秒钟,那么从两只开始的时候就减去开始的两秒不就好了啊!正解就是118秒
BeeColdfish 2012-03-05
  • 打赏
  • 举报
回复
个人愚见:本问题条件:虫子个数;所需答案:充满整个瓶子的时间;
显而易见:
初始虫子个数 需要时间
2^0个 ----- 2*60秒
2^1个 ----- 2*59秒
2^2个 ----- 2*58秒
2^3个 ----- 2*57秒
.
.
.
2^59个 ----- 2*1秒
2^60个 ----- 2*0秒
这时候,答案显而易见,我们看下二进制数据对应情况:
1 1 2*60秒
2 01 2*59秒
3 11 2*59秒
4 100 2*58秒
5 101 2*58秒
6 110 2*58秒
7 111 2*58秒
8 1000 2*57秒
结论是:初始虫子数的二进制位数 + 所需秒数 / 2 = 61
而初始虫子数的二进制位数可以通过64-Long.numberOfLeadingZeros(虫子个数)得出;
故时间为122 - 2*初始虫子数二进制位数。具体方法如下:
/**
* 初始num个虫子的情况下,获取充满整个瓶子需要的时间
* @param num 初始虫子数
* @return 需要时间
*/
private static int getTime(long num){
int i = 64-Long.numberOfLeadingZeros(num);//首先获取初始虫子数的位数
return 122 - (i << 1);//i左移一位,即i*2
}
并且整个瓶子最多有2^60个虫子,所以只用long完全可以解决问题。
allan_chan 2012-03-05
  • 打赏
  • 举报
回复
118
lwlianglove2 2012-03-05
  • 打赏
  • 举报
回复
你妹啊,这明明就是高中生物题,我做过类似的!
陌上拾年 2012-03-05
  • 打赏
  • 举报
回复
面试题伤不起。。。
superhill 2012-03-05
  • 打赏
  • 举报
回复
2^60 = 2*2^n

n=59

t=n*2=118
什么都不留 2012-03-04
  • 打赏
  • 举报
回复
118 正确。。。
ihrthk 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 llhwin2010 的回复:]
使用程序写的时候要注意int或者double越界的问题,int是绝对不可以的,double估计也不可以吧,我感觉这个题考的就是这个问题,怎么解决那个越界的问题!

哪位大神给解决一下啊
[/Quote]
用BigInteger ,无限位,用new BigInteger(String str)构造,你懂的。
songhuanle 2012-03-04
  • 打赏
  • 举报
回复
若是把分裂改为繁衍,求解!!!!!!
laoyao0228 2012-03-04
  • 打赏
  • 举报
回复
晚了 我脑子太废了 根本想不出来 我还傻呵呵的计算呢……
shizhibuyu20009 2012-03-03
  • 打赏
  • 举报
回复
分裂完你就没在了啊。它已经变成两个。[Quote=引用 8 楼 forgetsam 的回复:]

引用 5 楼 chenxinhui741 的回复:
引用 1 楼 chc464954573 的回复:
2分钟 120秒

现在最初2只,也就是放入1只 2秒中之后的情况。也就是120 - 2,118秒



误解,这个起码没考虑起初那1只虫子,以及它繁衍的虫子,所占的空间


你就是会被这种题目考住的人。
[/Quote]
pupingpp 2012-03-03
  • 打赏
  • 举报
回复
越界的话就用BigDecimal类啊,可以解决任意长度的浮点数的,正解我觉得是118秒
jackasdn 2012-03-03
  • 打赏
  • 举报
回复
118s正解
walkman_22 2012-03-03
  • 打赏
  • 举报
回复
队列,WHILE循环。鉴定完毕。
nongchao2011 2012-03-03
  • 打赏
  • 举报
回复
两次分裂中瓶子中的虫子的总数是相同的,只是开始分裂的时候初始值不一样,一个设定的是1,另一个设定的是2;两次的递增都是按照2的幂开始递增的,下面程序供大家参考,就像在解数学方程,拙劣之处望大家指正
public class Insect {

/**
* @param args
*/
public static double insectNum(int x,int second){//计算虫子总数
int temp=0;
double insectNumber=x;
while(temp<(second/2)){
insectNumber=insectNumber*2;
temp++;
}
return insectNumber;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//两次分裂中瓶子中的虫子的总数是相同的只是,只是开始分裂的时候初始值不一样,一个设定的是1,另一个设定的是2;
//两次的递增都是按照2的幂开始递增的
double b=insectNum(1,120);//计算总数

double a=2;
int j=0;//记录分裂的次数
while(a!=b){
a=a*2;
j++;
}

System.out.println(j*2);
}

}
robin_wang_0826 2012-03-03
  • 打赏
  • 举报
回复
大家说的都很热闹呀,可之后答案 ,也不知道真假
加载更多回复(60)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧