2017-04-09 56 views
0

我必須比較大數字,這些數字是1 < 2數字< 10^1000。運營商是:==,!=,>,<,> =,< =。我編寫了一些代碼,但它仍然在我的課程測試中顯示一些錯誤(97次測試中出現8次錯誤)。我沒有關於測試的細節。有人能告訴我哪裏出錯嗎?比較大數字

#include <iostream> 
#include <string> 

using namespace std; 

bool rowne(string a, string b) 
{ 
    if (a.length() == b.length()) 
    { 
     for (int i = 0; i < a.length(); ++i) 
     { 
      if (a[i] != b[i]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    else if (a.size() != b.size()) 
    { 
     return false; 
    } 
} 

bool mniejsze(string a, string b) 
{ 

    if ((a.length() < b.length())) 
    { 
     return true; 
    } 

    else if (a.length() == b.length()) 
    { 
     for (int z = 0; z < a.length(); ++z) 
     { 
      if (a[z] - '0' < b[z] - '0') 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
    else if (a.length() > b.length()) 
     return false; 
} 

int main() 
{ 
    string znak; 
    string a; 
    string b; 
    bool p = false; 
    cin >> a >> znak >> b; 

    while (a[0] == '0' && a.length() != 1) 
    { 
     a.erase(0, 1); 

    } 
    while (b[0] == '0' && b.length() != 1) 
    { 
     b.erase(0, 1); 

    } 
    if (znak == "==") 
    { 
     if (rowne(a, b) == true) 
      p = true; 
    } 
    else if (znak == "!=") 
    { 
     if (rowne(a, b) != true) 
      p = true; 
    } 
    else if (znak == "<") 
    { 
     if (mniejsze(a, b)) 
      p = true; 
    } 
    else if (znak == ">") 
    { 
     if (mniejsze(b, a)) 
      p = true; 
    } 
    else if (znak == "<=") 
    { 
     if (mniejsze(b, a) != true) 
      p = true; 
    } 
    else if (znak == ">=") 
    { 
     if (mniejsze(a, b) == false) 
      p = true; 
    } 

    if (p == true) 
     cout << "YES"; 
    else if (p == false) 
     cout << "NO"; 

    return 0; 
} 
+3

因爲這是課程作業,它非常有價值,你可以自己弄清楚這一點,但這裏這是一個有用的提示。由於你的課程測試人員不會告訴你哪些案件失敗了,哪些案件成功了,你應該讓自己的案件找到失敗的案例。如果您仍然沒有發現任何問題,請嘗試列出您正在製作的所有假設並重新檢查它們。 – jwimberley

+0

你的代碼是否只適用於正數?否則,'-1 <1'給出「NO」。 – Shibli

+0

該任務說1 maciek259

回答

0

您的代碼看起來很好,爲「快樂路徑」執行時,即當兩個輸入都是良好和比較操作員(znak?)是預先定義的一個。然而,人們可以(和你必須)拿出一組負面的測試,旨在「打破」你的代碼。下面是浮現在腦海中進行測試的事物的簡短列表:

  1. 前/後間隔
  2. 領先+/-號
  3. 非數字字符(羅馬數字,如第十九或CVIII;拼寫出數字,例如「五」,其他非數字相關字符,例如「$」,「@」等)
  4. 使用無效的比較運算符,例如一個輸入如「123等於123」
  5. 當您被要求比較兩個字符串時會發生什麼?

其中一個錯誤的非數字字符會在你的代碼公開的是,這條線:

if (a[z] - '0' < b[z] - '0') 

ASCII字符將完全跌破'0',如'$'(因爲這會產生負數,或產生一個整數溢出,在減去'0'之後 - 全部取決於char是否被定義爲您的版本的有符號或無符號)