我无法弄清楚当我在ideone上运行代码时会出现什么问题,它会给我一个运行时错误,它是一个UVa问题(UVa 11321)。
我有N个数字和一个正整数M.我必须对N个数字进行排序 按模数M值的升序排列。
如果奇数和偶数之间存在平局(即 他们的模数M值是相同的)然后奇数将在前面 偶数。
如果两个奇数之间存在联系(即模数为M 值是相同的)然后较大的奇数将在较小的前面 奇数和。
如果两个偶数之间存在平局(即它们的模数M值 是相同的)然后较小的偶数将在较大的偶数之前 号。
对于负数的余数值,遵循C的规则 编程语言:负数永远不会有模数 大于零。例如。 -100 MOD 3 = -1,-100 MOD 4 = 0
任何帮助请!!!!
#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;
}
答案 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 ) ) ;