2013-03-09 46 views
0

如果用戶用二進制輸入一個非常大的數字,輸出顯示爲0,那麼如何修改這個函數來處理更大的數字呢?Base2到Base10轉換器將不能使用非常大的數字?

{ 
    // Binary to Decimal converter function 

    int bin_Dec(int myInteger) 
    { 
    int output = 0; 
    for(int index=0; myInteger > 0; index++) 
    { 
    if(myInteger %10 == 1) 
     { 
      output += pow(2, index); 
     } 
    myInteger /= 10; 
    } 
    return output; 
    } 

    int _tmain(int argc, _TCHAR* argv[]) 
    { // start main 

    int myNumber; 

    // get number from user 

    cout << "Enter a binary number, Base2: "; // ask for number 
    cin >> myNumber; 

    //print conversion 

    cout << "Base10: " << bin_Dec(myNumber) << endl; // print conversion 
    system("pause"); 

    } // end of main 
} 
+3

'999'不是基數2的數字。 '1000'是,它可以和你的代碼一起工作。你遇到的真正問題是什麼?什麼具體是不適合你的輸入? – 2013-03-09 17:36:40

+1

不知道你在這裏問什麼...程序希望你輸入一個*二進制*數字。輸入'999'就不行。順便說一句,寫它的方式,它將接受的最高二進制數是1111111111(= 10位數)。它會輸出的最高數字是2023. – Hazzit 2013-03-09 17:38:24

回答

1

停止服用 「二進制數」 作爲int。 int的大小是有限的;最大值一般約爲20億,即10位數。當您將數字作爲位進行濫用時,會給您最多10 ,這相當於1023.

取而代之的是取代string。你沒有對輸入做任何有用的數學運算;無論如何,你只是將它用作一串數字。

// oh, and unless you have good reason...this would be better unsigned. 
// Otherwise your computer might catch fire when you specify a number larger 
// than INT_MAX. With an unsigned int, it's guaranteed to just lop off the 
// high bits. 
// (I may be overstating the "catch fire" part. But the behavior is undefined.) 
unsigned int bin_to_dec(std::string const &n) { 
    unsigned int result = 0; 
    for (auto it = n.begin(); it != n.end(); ++it) { 
     result <<= 1; 
     if (*it == '1') result |= 1; 
    } 
    return result; 
} 

如果你有C++ 11,雖然,有std::stoi和家庭(以<string>定義),當你除非你重新發明輪子,學習之用指定基地2.將爲你做這個,它使用它們會更好。

std::cout << "Base10: " << std::stoi(myNumberString, 0, 2) << '\n'; 
+0

附註:雖然結果是正確的,但我認爲使用'result + = 1;'操作而不是'result | = 1;'更正確'' – SomeWittyUsername 2013-03-09 18:08:26

+0

取決於你考慮它。我認爲它更「移入」1或0.但X * 2 + 1也是正確的。 – cHao 2013-03-09 18:11:08

+0

順便說一句,在LWS的g ++ 4.7.2編譯器似乎不喜歡你的代碼,我不明白爲什麼:http://liveworkspace.org/code/2OTOP6$4 – SomeWittyUsername 2013-03-09 18:15:02

相關問題