sicily 6573. 奇偶分开

Description
将输入的一串数中的负数延迟输出,从而分离非负数和负数 例如输入的数是: P1 N1 P2 N2 那么你处理完之后的输出应该是: P1 P2 N1 N2 注意: 非负数之间的输出顺序和输入顺序相同,负数之间的输出顺序和输入顺序也是要求相同的。

Input
输入有多个case: 每个case的输入有1行。每一行的第一个整数是N,代表这个输入有N个数需要处理,接下来有N个整数。

Output
对于每个case输出一行,这1行包括N个整数,整数之间以空格隔开。 输入以EOF结束

 

其实是从实验手册上改过来的题目,原题是奇数偶数分开输出,TA改成了非负数和负数分开输出,但是没改名字……于是名不对题了

有4种做法

① 扫描两遍数组,分别打印出非负元素与负元素,AC用时0.01sec

View Code
 1 #include<stdio.h> 
 2 #define MAX 10001
 3 void printBySign ( const int array[], int size );
 4 
 5 int main()
 6 {
 7     int n;
 8     int i;
 9     int array[MAX] = {0};
10     
11     while ( scanf( "%d", &n ) != EOF )
12     {
13         for ( i = 0; i < n; i++)
14         {
15             scanf( "%d", &array[i] );
16         }
17         
18         printBySign( array, n );
19     }
20     
21     return 0;
22 }
23 
24 void printBySign( const int array[], int size )
25 {
26     int i;
27     int negative = 0;
28     int nonnegative = 0;
29     
30     int printspace = 0;
31     
32     for ( i = 0; i < size; i++ )
33     {
34         if ( array[i] >= 0 )
35         {
36             printf( "%d", array[i] );
37             
38             if ( i != size - 1 )
39             {
40                 printf( " " );
41             }
42             else
43             {
44                 printspace = 1;
45             }
46             
47             nonnegative++;
48         }
49     }
50     
51     for( i = 0; i < size; i++ )
52     {
53         if ( array[i] < 0 )
54         {
55             if ( printspace == 1 )
56             {
57                 printf( " " );
58                 printspace = 2;
59             }
60             
61             printf( "%d", array[i] );
62             negative++;
63             
64             if ( negative + nonnegative != size )
65             {
66                 printf( " " );
67             }
68         }
69     }
70     
71     printf( "\n" );
72     
73     return;
74 }

② 新开两个数组,分别用于存储非负元素与负元素,再打印出这两个新数组,AC用时0.02sec;

View Code
 1 #include<stdio.h> 
 2 void moveBySign ( int array[], int size );
 3 void printArray( const int array[], int size );
 4 
 5 int main()
 6 {
 7     int n;
 8     int i;
 9     int array[10001] = {0};
10     
11     while ( scanf( "%d", &n ) != EOF )
12     {
13         for ( i = 0; i < n; i++)
14         {
15             scanf( "%d", &array[i] );
16         }
17         moveBySign( array, n );
18     }
19     
20     return 0;
21 }
22 
23 void moveBySign( int array[], int size )
24 {
25     int i = 0, j = 0, k = 0;
26     int negative[10001] = {0};
27     int positive[10001] = {0};
28     
29     for ( i = 0; i < size; i++ )
30     {
31         if ( array[i] < 0 )
32         {
33             negative[j] = array[i];
34             j++;
35         }
36         else
37         {
38             positive[k] = array[i];
39             k++;
40         }
41     }
42     
43     if ( k >= 1 )
44     {
45         printArray( positive, k );
46     }
47     
48     if ( k >= 1 && j >= 1)
49     {
50         printf( " " );
51     }
52     
53     if ( j >= 1 )
54     {
55         printArray( negative, j );
56     }
57     printf( "\n" );
58     
59     return;
60 }
61 
62 void printArray( const int array[], int size )
63 {
64     int i;
65     
66     printf( "%d", array[0] );
67     
68     for ( i = 1; i < size; i++ )
69     {
70         printf( " %d", array[i] );
71     } 
72     
73     return;
74 }

③ 优化过的②,先扫描一遍,打印出非负元素,并将负元素存储在新开的数组里,然后再打印出这个负元素数组,AC用时0.01sec

View Code
 1 #include<stdio.h> 
 2 void printBySign ( int array[], int size );
 3 void printArray( const int array[], int size );
 4 
 5 int main()
 6 {
 7     int n;
 8     int i;
 9     int array[10001] = {0};
10     
11     while ( scanf( "%d", &n ) != EOF )
12     {
13         for( i = 0; i < n; i++)
14         {
15             scanf( "%d", &array[i] );
16         }
17         
18         printBySign( array, n );
19     }
20     
21     return 0;
22 }
23 
24 void printBySign( int array[], int size )
25 {
26     int i = 0, j = 0, k = 0;
27     int negative[10001] = {0}; 
28     int printspace = 0;
29     
30     for ( i = 0; i < size; i++ )
31     {
32         if( array[i] >= 0 )
33         {
34             printf("%d", array[i]);
35             
36             if( i != size - 1 )
37             {
38                 printf(" ");
39             }
40             else
41             {
42                 printspace = 1;
43             }
44         }
45         else
46         {
47             negative[j] = array[i];
48             j++;
49         }
50     }
51     
52     if ( j >= 1 )
53     {
54         if ( printspace == 1 )
55         {
56             printf(" ");
57             printspace == 2;
58         }
59         
60         printArray( negative, j );
61     }
62     
63     printf("\n");
64     
65     return;
66 }
67 
68 void printArray( const int array[], int size )
69 {
70     int i;
71     
72     printf( "%d", array[0] );
73     
74     for ( i = 1; i < size; i++ )
75     {
76         printf( " %d", array[i] );
77     } 
78     
79     return;
80 }

④ 使用类似冒泡排序的方法,只不过修改了元素交换条件。对原数组进行修改,再打印出来,AC用时0.12sec

View Code
 1 #include<stdio.h> 
 2 #define MAX 10001
 3 void printBySign ( int array[], int size );
 4 void swapInArray( int array[], int first, int second );
 5 void printArray( const int array[], int size );
 6 
 7 int main()
 8 {
 9     int n;
10     int i;
11     int array[MAX] = {0};
12     
13     while ( scanf( "%d", &n ) != EOF )
14     {
15         for ( i = 0; i < n; i++)
16         {
17             scanf( "%d", &array[i] );
18         }
19         
20         printBySign( array, n );
21     }
22     
23     return 0;
24 }
25 
26 void printBySign( int array[], int size )
27 {
28     int i, j;
29     
30     for ( i = 1; i < size; i++ )
31     {
32         for ( j = 0; j < size - 1; j++ )
33         {
34             if ( array[j] < 0 && array[j+1] >= 0 )
35             {
36                 swapInArray( array, j, j+1 );
37             }
38         }
39     }
40     
41     printArray( array, size );
42     
43     return;
44 }
45 
46 void swapInArray( int array[], int first, int second )
47 {
48     int temp;
49     
50     temp = array[first];
51     array[first] = array[second];
52     array[second] = temp;
53     
54     return;
55 }
56 
57 void printArray( const int array[], int size )
58 {
59     int i;
60     
61     printf( "%d", array[0] );
62     
63     for ( i = 1; i < size; i++ )
64     {
65         printf( " %d", array[i] );
66     } 
67     
68     printf("\n");
69     
70     return;
71 }
posted @ 2012-12-11 20:54  Joyee  阅读(251)  评论(0编辑  收藏  举报