首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一道笔试题,该怎么处理

2012-03-21 
一道笔试题Trilogy公司的笔试题如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1。问对于一个给定的n

一道笔试题
Trilogy公司的笔试题

如果n为偶数,则将它除以2,    
如果n为奇数,则将它加1或者减1。    
问对于一个给定的n,怎样才能用最少的步骤将它变到1。    
例如:    
n=     61    
n--     60    
n/2     30    
n/2     15    
n++     16    
n/2     8    
n/2     4    
n/2     2    
n/2     1    
 
 
我的想法是这样的:    
当n为偶数时,没得选择,除以2就好。所以关键是看对奇数时怎么处理。    
当n为奇数时,如果为1,就结束了,如果不为1,那肯定可以表示成下面得等式:    
n=m*2+1    
此时选择对n是加1还是减1呢?    
如果上式中的m是偶数的话,那n减1,因为m可以继续除以2。如果m是奇数的话,n加1,再除以2之后得到m+1,m+1是偶数可以继续除以2。当然n为3的时候应该减去1。  

我觉得基本上就是“贪心”的思想。

[解决办法]
if(n&1==0)
n > > = 1;
else if(n&3==3)
n ++;
else
n --;

热点排行