数字后面的最高幂为 2

highest power of 2 behind a number

本文关键字:高幂 数字      更新时间:2023-10-16

我正在编写一个代码来给出一行中的数字,输入以零结束,然后使用最大功率 2 小于或等于一行中的输入。 它不起作用。

#include<iostream>
#include<stdio.h>
using namespace std;
int highestPowerof2( int n)
{
static int result = 0;
for (static int i=n; i>=1; i--)
{
if ((i & (i-1)) == 0)
{
result = i;
break;
}
}
return result;
}
int main() {
static int num ;
do{
cin>>num ;
}
while(num=!0);
cout<<highestPowerof2(num)<<"n";
return 0;
}

代码中最令人惊讶的是:

do{
cin>>num ;
}
while(num=!0);

您不断读取用户输入的num,直到num == 0。我不得不承认,我并不真正理解您的其余代码,但是对于num == 0调用函数highestPowerof2(num)总是会导致0

也许您想重复该程序,直到用户决定退出,这可能是

do{
cin>>num ;
cout<<highestPowerof2(num)<<"n";
} while(num=!0);

PS:另一个"令人惊讶"的事情是,您在没有真正意义的地方使用static。最好简单地删除它。

这是另一种对于大型n来说速度稍快的方法。例如,如果n = 2^31 - 1,则原始循环需要迭代 2^30 - 1 = 1,073,741,823 次,而此循环只需要一次迭代(sizeof(int) == 4提供(:

#include <iostream>
#include <stdio.h>
using namespace std;
int highestPowerof2( int n)
{
if (n < 0) return 0;
int result = 0;
int num_bits = sizeof(int) * 8;
unsigned int i = 1 << (num_bits - 1);
while(i > 0) {
if (n >= i) return i;
i >>= 1;
}
return 0;
}
int main() {
int num ;
while (1) {
cin >> num;
cout << highestPowerof2(num) << "n";
if (num == 0) break;
}
return 0;
}