题目要求
编写一个C程序,实现以下功能:
输入n个人的身高,然后从n个人中选出身高差值最小的两个人作为礼仪
(如果差值相同的话,选取其中最高的两个人),要求输出两个礼仪的身高。(使用函数实现)
思路难点:
1.怎么去找差值最小,然后返回两个人的身高呢。要知道如果乱序输入身高,怎么进行比较是个难度,保存两个人身高再返回也是难点
2.如果差值相同,最高两个人身高怎么找?怎么返回?
思路:
1.对于这种乱序的情况,没有更好的方法(也许只是我没有想到,实力不够)只能通过两层for循环来依次实现数值相减。虽然时间复杂度较高,但由于是学生实验而不是oj,倒是可以容忍(假的,我忍不了)
2.可以通过事先排好序然后去返回数组arr[n-1],arr[n-2](注意数组arr[n]放的是‘\0’)
答案:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
/*编写一个C程序,实现以下功能:
输入n个人的身高,然后从n个人中选出身高差值最小的两个人作为礼仪
(如果差值相同的话,选取其中最高的两个人),要求输出两个礼仪的身高。
*/
#define MAX 500
void func(int* arr, int n, int* a, int* b) {int min = abs(a - b);//定义一个最小量,之后通过动态规划去不断改变这个值,直到找到最小for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {//差值不同if (abs(arr[i] - arr[j]) < min) {min = abs(arr[i] - arr[j]);//绝对值函数,头文件是math.h*a = arr[i];*b = arr[j];}//差值相同else{*a = arr[n - 2];//记住‘\0’的存在*b = arr[n - 1];}}}
}
int main() {int n, arr[MAX];scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}int a, b;//定义两个差值最小的人,假定为数组的0和1元素a = arr[0], b = arr[1];sort(arr, arr + n);//这里的sort是一个C++里面的STL,我懒得去写排序代码,直接用排序函数了//这里用冒泡排序是同理的。func(arr, n,&a,&b);printf("%d %d", a, b);
}
个人感觉是没有什么技术难点,但感觉代码不是很美观。而且时间复杂度也很高。继续加油吧