求最接近整数n的2^i值

Find the nearest 2^i value to integer n

本文关键字:最接近 整数      更新时间:2023-10-16

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

通过线性搜索:

更新索引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^82^16进行比较。这需要1到5次比较。然后,您将有n的括号,包括2^1, 2^2, 2^4, 2^82^16元素,您将通过二分法确定,需要0,1,2,3或4个额外的比较。

找到答案了!!,我们所需要做的就是把&&操作符……如下所述……

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