我正在尝试解决geeksforgeeks测试用例检查整数是否为8的幂。
我使用c ++制作了测试用例。在这个程序中,当我提供像8589934592
这样的长整数时。但是,条件变为false
并且测试用例失败。
#include <iostream>
using namespace std;
int main()
{
unsigned int n, n1;
cin>>n; // Denoting the number of test cases
for(int i = 0; i < n; i++)
{
cin>>n1; // An integer number
while(n1 > 8)
{
n1 = n1 / 8;
}
if(n1 == 8)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
那么,为什么测试用例对8位数的长功率不起作用?
以下是示例输入:
2
307163648379016
8589934592
期望的输出:
No
Yes
答案 0 :(得分:1)
对代码稍作修改即可显示中间结果 它们非常有趣,以极其慷慨的方式表明您的代码出错的地方 顺便说一下,这样做不是那么长。 ; - )
由于这是一个关于挑战的问题,我将仅提供修改后的代码,以便为您提供正确的想法。
#include <iostream>
using namespace std;
int main()
{
uint64_t n, n1;
cin>>n; // Denoting the number of test cases
cout << n << endl;
for(int i = 0; i < n; i++)
{
cin>>n1; // An integer number
cout << n1 << endl;
while(n1 / 8)
{
n1 = n1 / 8;
cout << n1 << endl;
}
if(n1 == 8)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
输出:
3
3
69
69
8
Yes
8589934592
8589934592
1073741824
134217728
16777216
2097152
262144
32768
4096
512
64
8
Yes
307163648379016
307163648379016
38395456047377
4799432005922
599929000740
74991125092
9373890636
1171736329
146467041
18308380
2288547
286068
35758
4469
558
69
8
Yes
我可以建议学习调试吗? 调试的技巧可以很好地利用调试器程序,但更重要的调试器应该在监视器和键盘之间。
答案 1 :(得分:0)
我在测试用例中做了一些修正并解决了这个问题。
首先,我在%
循环条件中使用了/
运算符而不是while()
运算符,这是我犯的愚蠢错误。
然后,如果数字等于1,我已经改变了,那么数字是8的幂,否则数字不是8的幂。
我完美的工作代码:
#include <iostream>
using namespace std;
int main()
{
uint64_t n, n1;
cin>>n; // Denoting the number of test cases
for(int i = 0; i < n; i++)
{
cin>>n1; // An integer number
while(n1%8 == 0)
{
n1 = n1 / 8;
}
if(n1 == 1)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
<强>输入:强>
2
307163648379016
8589934592
<强>输出:强>
No
Yes
非常感谢@ Yunnosch帮助我。
答案 2 :(得分:0)
我们不能只比较比特来确定它是否是8的幂?
#include <limits>
constexpr unsigned long long pow8bits()
{
unsigned long long result = 0;
for (unsigned i = 3 ; i < std::numeric_limits<unsigned long long>::digits ; ++i)
{
result |= static_cast<unsigned long long>(1) << i;
}
return result;
}
bool is_power_of_8(unsigned long long val)
{
return (val & pow8bits()) != 0
and (val & ~pow8bits()) == 0;
}