长整数不适用于 C++ 中的 8 次幂
Long integer number doesn't work for power of 8 in C++
我正在尝试解决 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;
}
那么,为什么测试用例对八的长次幂不起作用?
这是示例输入:
2
307163648379016
8589934592
所需的输出:
No
Yes
对您的代码稍作更改即可显示中间结果。
它们非常有趣,以一种过于慷慨的方式指出您的代码哪里出错了。
顺便说一下,它对不太长的数字也是如此。 ;-)
由于这是一个挑战题,我将只提供修改后的代码来给你正确的想法。
#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
可以推荐学习调试吗?
调试的艺术可以很好地利用调试器程序,但更重要的调试器应该在显示器和键盘之间。
我在我的测试用例中做了一些修正并解决了那个问题。
首先,我在 while()
循环条件中使用了 %
运算符而不是 /
运算符,这是我犯的一个愚蠢的错误。
然后,我改变了如果数字等于 1 那么数字是八的幂否则数字不是八的幂。
我的完美工作代码:
#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帮助我。
我们不能只比较位来确定它是否是 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;
}
我正在尝试解决 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;
}
那么,为什么测试用例对八的长次幂不起作用?
这是示例输入:
2
307163648379016
8589934592
所需的输出:
No
Yes
对您的代码稍作更改即可显示中间结果。
它们非常有趣,以一种过于慷慨的方式指出您的代码哪里出错了。
顺便说一下,它对不太长的数字也是如此。 ;-)
由于这是一个挑战题,我将只提供修改后的代码来给你正确的想法。
#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
可以推荐学习调试吗? 调试的艺术可以很好地利用调试器程序,但更重要的调试器应该在显示器和键盘之间。
我在我的测试用例中做了一些修正并解决了那个问题。
首先,我在 while()
循环条件中使用了 %
运算符而不是 /
运算符,这是我犯的一个愚蠢的错误。
然后,我改变了如果数字等于 1 那么数字是八的幂否则数字不是八的幂。
我的完美工作代码:
#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帮助我。
我们不能只比较位来确定它是否是 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;
}