2017-04-09 74 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是否被定义为您的版本的有符号或无符号)