排序函数给出大量输入 0 的浮点异常

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

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

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

我基本上想在这段代码中实现的是首先对最高有效数字使用基数排序逻辑,然后按降序排列。后来我正在做第二个最重要的数字等等。我通过传递成对的向量来使用 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]

它给出浮点异常。

我曾尝试寻找解决方案,但未能成功。我是 cpp 的初学者,如果有任何帮助,我将不胜感激。

您的 radixSort 函数违反了 Compare requirements,即非自反性(即 radixOrder(x, x) 必须 return false 但它 returns true 因为执行到第一个 if 分支)。

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

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

不过,我可以通过将输入数字按字符串倒序排序来解决问题。