排序函数为大输入 0 提供浮点异常
Sort function giving floating point exception for a large input of 0's
我已经为这个问题编写了一段代码:
给定一个非负整数列表,排列它们以使它们形成最大的数字。
例如,给定 [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;
}
不过,我只需以相反的顺序将输入数字排序为字符串即可解决问题。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 函数如何通知用户它基于函数原型抛出异常?
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 如何编写带有异常的构造函数
- 有没有办法捕获 STL 函数未被赋予正确参数的异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 从函数(不抛出函数)返回异常以进行消息格式化?
- 从 C++ 中异常的构造函数引发异常
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- C++中函数出现Bad_alloc异常
- 为什么 c++ 使用 throw() 关键字来指示函数不会引发任何异常
- 在析构函数内部处理异常(但不抛出)
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- 为sLinkedList编写插入函数时引发异常
- c++运算符=工作异常(函数内部输出正常,但返回后错误)