比较大数字

时间:2017-04-09 16:00:13

标签: c++

我必须比较大数字,这些数字是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;
}

1 个答案:

答案 0 :(得分:0)

您的代码看起来很适合&#34;快乐路径&#34;执行,即两个输入都是格式良好的,比较运算符(znak?)是预定义的一个。然而,人们可以(并且你必须)提出一系列负面测试,旨在打破&#34;打破&#34;你的代码。这里列出了一些用于测试的想法:

  1. 领先/尾随空格
  2. 领先+/-标志
  3. 非数字字符(罗马数字,例如XIX或CVIII;拼写数字,例如&#34;五&#34;,其他非数字相关字符,例如&#34; $&#34;, &#34; @&#34;等)
  4. 使用无效的比较运算符,例如像&#34; 123这样的输入等于123&#34;
  5. 当您被要求比较两个字符串时会发生什么?
  6. 您的代码中会出现一个非数字字符的错误:此行:

    if (a[z] - '0' < b[z] - '0')
    
    对于'0'以下的ASCII字符,

    将完全中断,例如'$'(因为这会产生负数,或者在减去'0'后产生整数溢出 - 全部取决于是否为char被定义为您的构建已签名或未签名)