题目:特定位数比较
题目介绍:输入两行数据,第一行为 m 个正整数,以空格隔开;第二行为正整数 n ,且 n<= m;要求对第一行的数字的后三位大小进行排序,输出排行 n 的数字,其中,若不满三位数则直接比较;若两数字比较结果相等则两数相对位置不变;排序时位置从1开始。
例:
输入:
12 450 9001 5231 8231 7231
5
输出:
7231
分析:因为输入中并没有正整数 m 即输入正整数的个数,因此我们需要先解决“输入一行数字,以空格间隔,以回车结尾,存储在数组里”的问题,这个问题有两种解决方案,一种是直接int p[100] ;每有一个数字存储进数组k++,最终 k 的值就是数组的长度;另一种是用 vector 和 reserve ,预设100空间,这样不用占用太多内存,详情见代码。其次要解决的问题就是数字的后三位比较,这个直接取余1000就可以办到。最后的问题是排序,把源数组和取余后的数组放在一起,序号一一应对,拍完序直接输出下标 [ n-1 ] 即可。
1 #include <iostream> 2 #include <vector> 3 #include <stdlib.h> 4 using namespace std; 5 int main() 6 { 7 vector <int> p; 8 int i = 0, j = 0, k = 0; 9 int n; 10 int mid = 0; 11 int a; 12 char c; 13 p.reserve(100); 14 p.push_back(0); 15 while (cin >> a) 16 { 17 p[k++] = a; 18 p.push_back(k); 19 if ((c=getchar()) == ' ') 20 { 21 break; 22 } 23 } 24 int *q = new int[k]; 25 for (i = 0; i < k; i++) 26 { 27 q[i] = p[i] % 1000; 28 }//取后三位数字 29 for (i = 0; i < k; i++) 30 { 31 for (j = 0; j < k; j++) 32 { 33 if (q[i] > q[j] && i < j) 34 { 35 mid = q[i]; 36 q[i] = q[j]; 37 q[j] = mid;//中间数 38 mid = p[i]; 39 p[i] = p[j]; 40 p[j] = mid; 41 } 42 } 43 } 44 cin >> n; 45 cout << p[n - 1] << endl; 46 }
结果如图: