找到最近的2 ^ i值到整数n

时间:2015-10-17 04:17:59

标签: c++ algorithm

我想找到并比较最接近的2 ^ i值和输入'n'(请参阅下面的代码段),因为现在它只是在i = i时被击中,而我希望它输出'i' '这会给我最近的2 ^ i wrt 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);
    }
    }

2 个答案:

答案 0 :(得分:0)

通过线性搜索

您更新索引i,使2^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^8进行2^16次比较。这需要1到5次比较。然后,您将对n进行包围,其中包含2^12^22^42^82^16元素,您将确定这些元素通过二分法,需要进行0,1,2,3或4次额外比较。

答案 1 :(得分:-1)

得到答案!!,我们需要做的就是把&amp;&amp;&amp;运营商...如下所示...

    #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);
    }
    }