hdu 5055 Bob and math problem
先把各个数字又大到小排列,如果没有前导零并且为奇数,则直接输出。如果有前导零,则输出-1。此外,如果尾数为偶数,则从后向前找到第一个奇数,并把其后面的数一次向前移动,并把该奇数放到尾部。
值得注意的是当输入为960时,通过这种方法会得到具有前导零的数字。因此最后需要判断进行移动后,首位是否为零。
代码如下:
1 #define MAXN 101 2 #include <stdlib.h> 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 using namespace std; 7 int arr[MAXN]; 8 int N; 9 bool comp(int a, int b) 10 { 11 return a>b; 12 } 13 14 void p(int *a) 15 { 16 for( int i = 0 ; i < N ; i++ ) 17 { 18 printf("%d", a[i]); 19 } 20 printf("\n"); 21 } 22 void solve() 23 { 24 sort(arr, arr+N, comp); 25 if( arr[N-1] & 1 && arr[0] != 0) 26 { 27 p(arr); 28 } 29 else if( arr[0] == 0 ) 30 { 31 printf("%d\n", -1); 32 } 33 else 34 { 35 for( int i = N-2 ; i >= 0 ; i-- ) 36 { 37 if( arr[i] & 1 ) 38 { 39 int tmp = arr[i]; 40 for( int j = i+1 ; j <= N-1 ; j++ ) 41 { 42 arr[j-1] = arr[j]; 43 } 44 arr[N-1] = tmp; 45 break; 46 } 47 } 48 if( arr[N-1] & 1 && arr[0] != 0) 49 { 50 p(arr); 51 } 52 else 53 { 54 printf("%d\n", -1); 55 } 56 } 57 } 58 int main(int argc, char *argv[]) 59 { 60 while( scanf("%d", &N ) != EOF) 61 { 62 for( int i = 0 ; i < N ; i++ ) 63 { 64 scanf("%d", &arr[i]); 65 } 66 solve(); 67 } 68 return 0; 69 }