我想找到并比较最接近的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);
}
}
答案 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
。然后,您考虑i
和j
的中间的第三个索引,并找到包含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^1
,2^2
,2^4
和2^8
进行2^16
次比较。这需要1到5次比较。然后,您将对n
进行包围,其中包含2^1
,2^2
,2^4
,2^8
或2^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);
}
}