2015-10-17 63 views
-4

我想找到与最近2^I值与输入“N”(参见下面的代码段),因为现在它只是被在我打= I ,而我希望它输出的是“我”,这会给我最近的2 ^我WRTň...发现最近的2^I值整数n

#include<iostream> 
    #include<math.h> 
    using namespace std; 
    int main() 
    {long n; 
     int i,t; 
     cin>>t; 
     while(t--) 
     {cin>>n; 
     for(i=1;i<30;i++) 
     { 
     if(pow(2,i)<=n<=pow(2,i+1)) 
     break; 

     }cout<<pow(2,i); 
    } 
    } 
+1

请详细说明你的问题。对于某些指定的输入,您的预期和实际输出是什么?请修改您的问题以包含该信息(另请[请阅读如何提出良好问题](http://stackoverflow.com/help/how-to-ask))。 –

+3

但是,你的问题的一个很好的候选人是表达式'pow(2,i)<= n <= pow(2,i + 1)'。 C++不是数学,你不能像数学一样使用条件。表达式'pow(2,i)<= n <= pow(2,i + 1)'并没有真正达到你期望的效果。 –

+0

只有少数提示你不需要pow或者甚至是log2 ...为什么不使用bit-shift直到它碰撞翻转n比较? – Spektre

回答

0

通过线性搜索

你以这样的方式更新索引i2^i <= n始终是真实的,并i尽可能的大,即直至n < 2^(i+1)

i= 0 # 2^0 <= n, provided 1 <= n 
while (2 << i) <= n: # 2^(i+1) <= n 
    i= i+1 # 2^i <= n 
# 2^i <= n < 2^(i+1) 

注意:此代码失败为n >= 2^31,在换挡2 << i溢出。

while循环将在0到31次之间执行。

通过二分搜索

你让两个指标,以这样的方式2^i<=n<2^j。然后,您考虑在ij中间的第三个索引,并找到包含n的子区间。

i= 0 # 2^i <= 1, provided 1 <= n 
j= 32 # n < 2^32, assuming 32 bits unsigned; then 2^i <= n < 2^j 
while j - i > 1: 
    k= (i + j) >> 1 
    if (1 << k) <= n: # 2^k <= n 
     i= k # 2^i <= n < 2^j 
    else: # n < 2^j 
     j= k # 2^i <= n < 2^j 
# 2^i <= n < 2^(i+1), as j == i+1 

while循环仅执行5次!

通过指数/二分搜索

,如果你期望的n值比大更频繁地小,您可以使用一个变种。

执行<=比较与2^12^22^42^82^16,按照这个顺序。这需要1到5次比较。然后你将有一个包围n,其中包括2^1,2^2,2^4,2^82^16元素,你将通过二分法确定,需要0,1,2,3或4个额外的比较。

+0

注意,我没有彻底检查。 –

-1

得到的答案!!,我们需要做的是,把& &操作......下面给出...

#include<iostream> 
    #include<math.h> 
    using namespace std; 
    int main() 
    {long n; 
    int i,t; 
    cin>>t; 
    while(t--) 
    {cin>>n; 
    for(i=1;i<30;i++) 
    { 
    if((pow(2,i)<=n)&&(pow(2,i+1)>n)) 
    break; 

    }cout<<pow(2,i); 
    } 
    } 
+1

测试'pow(2,i)<= n'是无用的。 –