长整数不适用于 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;
}