求最接近整数n的2^i值
Find the nearest 2^i value to integer n
我想找到并比较最接近输入'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
。然后考虑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个额外的比较。
找到答案了!!,我们所需要做的就是把&&操作符……如下所述……
#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);
}
}
相关文章:
- 查找最接近的大于当前数字的数字的索引
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 查找索引的最接近的真实值
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- C++ lower_bound() 搜索最接近目标值的元素
- C++有效地找到向量中第一个最接近的匹配值?
- 在 c++ 中,能够将浮点类型加 1 的最大整数是多少?
- 在结构向量中查找最接近的值
- 查找整数数组中最接近的数字
- 我的程序不断四舍五入到最接近的整数
- 将整数舍入到另一个整数的最接近的倍数
- 如果我想将一个无符号整数四舍五入到最接近的更小或等于偶数的整数,我可以除以2然后乘以2吗
- 最接近 C++03 中浮点值的整数
- 取浮点数最接近的整数次幂
- 将整数移动到最接近的可被 4 整除的 C++
- 求最接近整数n的2^i值
- 寻找QT函数将qint64类型的变量(整数)四舍五入到最接近的十
- 如何四舍五入的总成本(双)到最接近的整数
- 整数boost::multiprecision::mpq_rational到最接近的整数
- 如何有效地找到最接近两个整数以100,000为增量的平均值的最大整数