长整数不适用于C ++中8的幂

时间:2017-09-18 05:40:14

标签: c++ long-integer

我正在尝试解决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

3 个答案:

答案 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;
}