Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为0';的大输入提供浮点异常的排序函数;s_C++_Sorting_Radix Sort_Floating Point Exceptions - Fatal编程技术网

C++ 为0';的大输入提供浮点异常的排序函数;s

C++ 为0';的大输入提供浮点异常的排序函数;s,c++,sorting,radix-sort,floating-point-exceptions,C++,Sorting,Radix Sort,Floating Point Exceptions,我已经为此问题编写了一个代码: 给定一个非负整数列表,将它们排列成最大数 例如,给定[3,30,34,5,9],最大形成数为9534330 注意:结果可能非常大,因此需要返回字符串而不是整数 基本上,我在这段代码中试图实现的是,首先对最重要的数字使用基数排序逻辑,并按降序排列。后来我做了第二个最重要的数字等等。我通过传递对向量使用了std::sort()函数,其中对的第一个是值,对的第二个是索引。以下是我的代码: bool radixOrder(pair<int,int> p1, p

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

给定一个非负整数列表,将它们排列成最大数

例如,给定[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();
}
bool radixOrder(对p1,对p2)
{
int val1=p1.first;
int e1=p1.2秒;
int val2=p2.first;
int e2=p2.2秒;
if(val1==val2&&e1==e2)
{
返回值val1==val2;
}
如果((val1/e1)%10)==(val2/e2)%10))
{
while(val1/e1==val2/e2)
{
如果(e1/10!=0)
e1=e1/10;
如果(e2/10!=0)
e2=e2/10;
}
返回(val1/e1)%10>(val2/e2)%10;
}
其他的
{
返回(val1/e1)%10>(val2/e2)%10;
}
}
vector createVNew(vector&v)
{
向量温度;

对于(int i=0;i您的
radixSort
函数违反了,即不可伸缩性(即,
radixOrder(x,x)
必须返回
false
,但它返回
true
,因为执行转到第一个
if
分支)

这里有一个典型的未定义行为的例子,我相信这段代码应该像

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

不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。

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

这里有一个典型的未定义行为的例子,我相信这段代码应该像

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

不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。

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

这里有一个典型的未定义行为的例子,我相信这段代码应该像

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

不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。

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

这里有一个典型的未定义行为的例子,我相信这段代码应该像

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

不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。

没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。非常感谢。我还有一个问题,为什么代码只在大输入时崩溃,而不是在小输入时崩溃?还有,这只是出于好奇,但你是如何得出比较器一定是错的结论的?我曾尝试过很多次搜索,但都没有找到。你真是天才@Anton Savin:)@User222321没有问题。要回答为什么在这种特殊情况下,它只在大输入时崩溃,您必须调试到
排序
实现中。@User222321:
std::sort
通常递归工作:要对序列排序,将其分成两组并排序,然后合并两部分。现在看来,这对r小集合。将两个元素的序列拆分为两个元素的两半显然是没有效率的。因此,
std::sort
通常针对小集合进行优化,这种优化很可能以不同的方式调用谓词。非常感谢。我还有一个问题,为什么代码只在大输入时崩溃不是更小的吗?还有,这只是出于好奇,但你是如何得出比较器一定是错的结论的?我试着搜索了很多次,但都没有找到。你真是天才@Anton Savin:)@user222321没问题。要回答为什么在这种特殊情况下,只有大输入才会崩溃,你必须调试into
sort
实现。@user2223211:
std::sort
通常是递归工作的:要对序列进行排序,将其分成两个集合,然后对它们进行排序,然后合并这两个部分。现在发现,这对于小集合来说是无效的。将两个元素的序列分成两个半部,每个元素分成两个半部显然是无效的。因此
std::sort
通常是针对小型集合进行优化的,这种优化很可能以不同的方式调用谓词。非常感谢。我还有一个问题,为什么代码只针对大型输入而不是较小的输入崩溃?还有,出于好奇,仅此一个,但您是如何得出比较器μ可能是错了吗?我试着搜索了很多次,但都没有找到。你真是天才@Anton Savin:)@user222321没问题。要回答为什么在这种特殊情况下,只有大输入才会崩溃,你必须调试到
sort
实现中。@user2223211:
std::sort
通常是递归工作的:对se进行排序中断