2017-09-18 2 views
-4

geeksforgeeksのテストケースを解決しようとしています整数が8の累乗であるかどうかを確認してください。長整数型はC++で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 
+4

あなたの入力番号は、「符号なし整数」の可能な最大値よりも大きいです。あなたは 'uint64_t'をタイプ –

+0

として試すことができます。C++は静的に型付けされています。 'cin'はnやn1を魔法のように' long'整数に変換しません。 @ – StoryTeller

+0

@M。長い番号のようにも動作しないM:307163648379016 – Jayesh

答えて

0

私はテストケースでいくつかの修正を行い、その問題を解決しました。

最初にオペレータの代わりに%オペレータを使用しました。ループ状態は私によってばかげて間違っていました。 次に、numberが1の場合、numberは8の累乗で、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 @ありがとうございました。

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 

は私がデバッグ学ぶことをお勧めできますか? デバッグの技術は、デバッガプログラムを非常に有効に活用できますが、モニタとキーボードの間には、より重要なデバッガが必要です。

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; 
} 
関連する問題