2015-06-15 41 views
0

我已经写了代码这个问题:排序功能,给予浮点异常的大输入0的

鉴于非负整数的列表,安排它们,这样它们形成的数量最多。

例如,给定[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]

它给出了浮点异常。

我试过找到解决方案,但还没有能够。我是cpp的初学者,任何帮助都会很棒。

+0

无法登录就无法访问您的链接。在这里发布内容。 – deviantfan

+0

完成。 @deviantfan – user2223211

回答

3

radixSort功能违反了Compare requirements,即irreflexivity(即radixOrder(x, x)必须返回false但由于执行转到第一if分支返回true)。

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

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

虽然被改写,我只想通过排序输入数字作为以相反的顺序串解决问题。

+0

非常感谢。我只是还有一个问题,为什么代码只是为大输入而不是小输入而崩溃?另外,出于好奇,这只是一个问题,但你是如何得出这样的结论:比较器必须是错的?我试图搜索很多,但没有接近它。这是你的天才@Anton Savin :) – user2223211

+1

@ user2223211没问题。要回答为什么在这种特殊情况下,它只会在大输入时崩溃,您必须调试到'sort'实现中。 –

+1

@ user2223211:'std :: sort'通常递归地工作:对一个序列进行排序,将它分成两组并对它们进行排序,然后合并这两部分。现在事实证明,这对于小集合来说效率不高。将一个元素的两个元素分割成一个元素的两个半部分显然是无效的。所以'std :: sort'通常针对小集合进行了优化,而且这种优化很可能以不同的方式调用谓词。 – MSalters