排序函数为大输入 0 提供浮点异常

Sort function giving floating point exception for a large input of 0's

本文关键字:异常 函数 输入 排序      更新时间:2023-10-16

我已经为这个问题编写了一段代码:

给定一个非负整数列表,排列它们以使它们形成最大的数字。

例如,给定 [3, 30, 34, 5, 9],最大形成数为 9534330。

注意:结果可能非常大,因此您需要返回字符串而不是整数。

基本上,我试图在此代码中实现的是首先在最高有效数字上使用基数排序逻辑,并按照降序排列它。稍后我正在做第二有效的数字,依此类推。我通过传递一个对向量来使用std::sort()函数,其中对的第一个是值,第二个是索引。以下是我的代码:

bool radixOrder(pair<int,int> p1, pair<int,int> p2)
{
    int val1=p1.first;
    int e1=p1.second;
    int val2=p2.first;
    int e2=p2.second;
    if(val1==val2 && e1==e2)
    {
        return val1==val2;
    }
    else if(((val1/e1)%10) == ((val2/e2)%10))
    {
        while(val1/e1 == val2/e2)
        {
            if(e1/10!=0)
                e1=e1/10;
            if(e2/10!=0)
                e2=e2/10;
        }
        return (val1/e1)%10 > (val2/e2)%10;
    }
    else
    {
        return (val1/e1)%10 > (val2/e2)%10;
    }
}
vector<pair<int,int> > createVNew(vector<int>& v)
{
    vector<pair<int,int> > temp;
    for(int i=0; i<v.size(); i++)
    {
        cout << i << endl;
        int val=v[i], e=1;
        if(v[i]==0)
        {
            temp.push_back(make_pair(val, 1));
        }
        else
        {
            while((e/v[i])==0)
                e*=10;
            if(e!=v[i])
            {
                temp.push_back(make_pair(val,e/10));
            }
            else if(e==v[i])
            {
                temp.push_back(make_pair(val,e));
            }
        }
    }
    return temp;
}
string largestNumber(vector<int>& v)
{
    int e=1;
    vector< pair<int,int> > vnew=createVNew(v);
    sort(vnew.begin(), vnew.end(), radixOrder);
    stringstream s;
    for(int i=0; i<vnew.size(); i++)
    {
        s<<vnew[i].first;
    }
    return s.str();
}

largestNumber(..)是我的函数,它返回所需的字符串。现在,此代码适用于我可以尝试的大多数非零输入。但是当输入是 0 的长向量时,如下所示:

[

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

它给出浮点异常。

我尝试过找到解决方案,但一直无法找到。我是 cpp 的初学者,任何帮助都会很棒。

您的radixSort函数违反了Compare要求,即不可反性(即radixOrder(x, x)必须返回false但它返回true,因为执行转到第一个if分支)。

所以你在这里得到了一个未定义行为的经典例子。我相信这段代码应该以某种方式重写,例如

if (e1==e2)
{
    return val1 > val2;
}

不过,我只需以相反的顺序将输入数字排序为字符串即可解决问题。