带有运行时错误的C ++代码

时间:2015-09-10 02:17:15

标签: c++ debugging runtime runtime-error

我无法弄清楚当我在ideone上运行代码时会出现什么问题,它会给我一个运行时错误,它是一个UVa问题(UVa 11321)。

我有N个数字和一个正整数M.我必须对N个数字进行排序 按模数M值的升序排列。

  1. 如果奇数和偶数之间存在平局(即 他们的模数M值是相同的)然后奇数将在前面 偶数。

  2. 如果两个奇数之间存在联系(即模数为M 值是相同的)然后较大的奇数将在较小的前面 奇数和。

  3. 如果两个偶数之间存在平局(即它们的模数M值 是相同的)然后较小的偶数将在较大的偶数之前 号。

  4. 对于负数的余数值,遵循C的规则 编程语言:负数永远不会有模数 大于零。例如。 -100 MOD 3 = -1,-100 MOD 4 = 0

  5. 任何帮助请!!!!

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <utility>
    using namespace std;
    
    bool sortPair (const pair < int , int > &x , const pair < int , int > &y)
        {
    
        if ( x.second > 0 && y.second < 0 )
        {
        return x.second < y.second ;
        }
    
        if ( x.second < 0 && y.second > 0 )
        {
            return y.second < x.second ;
        }
    
        if ( (x.second % 2 != 0) && (y.second % 2 == 0) && (x.first == y.first))
        {
            return x.second > y.second ;
        }
    
       if ( (x.second % 2 == 0) && (y.second % 2 != 0) && (x.first == y.first) )
        {
            return y.second > x.second ;
        }
    
    
    
       if ( (x.second % 2 == 0) && (y.second % 2 == 0) && (x.first == y.first) )
        {
            if ( x.second < y.second )
            {
            return y.second > x.second ;
            }
            else
            {
                return x.second < y.second ;
            }
        }
    
       if ( (x.second % 2 != 0) && (y.second % 2 != 0) && (x.first == y.first) )
        {
            if( x.second < y.second )
            {
                return x.second < y.second ;
            }
            else
            {
                return x.second > y.second ;
            }
        }
        else
        {
            return false;
        }
    
    
    
    
        }
    
    
    
        int main()
        {
    
    
        while ( true )
        {
    
            int n , m , x ,idx ;
            cin >> n >> m ;
            idx = n + 1 ;
    
            vector < pair < int , int > > u ;
    
            while ( cin >> x && idx != 0 )
            {
                u.push_back( make_pair ( x % m , x ) ) ;
                idx-- ;
    
             }
    
    
            sort ( u.begin() , u.end() - 1 ) ;
            sort ( u.begin() , u.end() - 1 , sortPair ) ;
    
    
            cout << n << " " << m << endl ;
    
            for ( int i = 0 ; i < n ; ++i )
            {
                cout << u.at(i).second << "\n" ;
            }
    
            cout << "0 0" << endl ;
    
        }
    
        return 0;
        }
    

    ideone link Problem link

1 个答案:

答案 0 :(得分:1)

将代码分解为更小,清晰易懂的部分会很有帮助。

这是我尝试重写你的功能,并对我有意义的评论。

PS 这是未经测试的代码。

bool sortPair (const pair < int , int > &x,
               const pair < int , int > &y)
{
   int xmod = x.first;
   int xval = x.second;

   int ymod = y.first;
   int yval = y.second;

   // The simple case. The mods are not equal.
   if ( xmod != ymod )
   {
      return xmod < ymod;
   }

   // Add the complicated logic when xmod is equal to ymod.

   bool x_is_odd = ((xval%2) != 0);
   bool y_is_odd = ((yval%2) != 0);
   bool x_is_even = !x_is_odd;
   bool y_is_even = !y_is_odd;

   // Check whether one is odd and the other is even.
   // If there is a tie between an odd number and an even number (that
   // their modulo M value is the same) then the odd number will precede
   // the even number.
   if ( x_is_odd && y_is_even )
   {
      return true;
   }
   if ( y_is_odd && x_is_even )
   {
      return false;
   }

   // Check whether both are odd.
   // If there is a tie between two odd numbers (that is their modulo M value
   // is the same) then the larger odd number will precede the smaller odd
   // number and.
   if ( x_is_odd && y_is_odd )
   {
      return (yval < xval);
   }

   // If we come here, then both are even.
   // If there is a tie between two even numbers (that their modulo M value
   // is the same) then the smaller even number will precede the larger
   // even number.
   assert ( x_is_even && y_is_even );
   return (xval < yval);
}

此外,修改创建向量元素的代码,以便在调用它们之前处理负值的mod。

     int mod = x%m;
     if ( x < 0 )
     {
        mod -= m;
     }

     u.push_back( make_pair ( mod, x ) ) ;