日期:2023-11-4
1.理解最小差值问题的本质:
关键在于对于不限位数的整数所罗列出来的多个不限个数的数字进行组合作差或是排序作差
由于设计到两个不限,此列问题需导入数组知识,对于数字进行储存后分别处理,寻求最小差值,定离不开有序的组合或是逻辑计算中合理的排序方式。程序在设计过程中简化这步骤,也可以提高相应的运行效率,所以也可以考虑建立函数对于数组进行处理,后进行作差比较。
2.整合出的两种做法:对应两种不同的思维方式
(1)方法一:导入数组元素,剥离数组元素逐个相减,并判断差值的正负,可以考虑绝对值函数简化判断过程。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a[1000];
int i,n,j,k;
int min, m_min;
min = 10000;
scanf("%d", &n);
for (i = 0; i < n; i++)//导入数组元素
{
scanf("%d",&a[i]);
}
for (j = 0; j < n; j++)
{
for (k = 0; k < j; k++)//剥离数组元素逐个相减,并判断差值的正负,这段应该可以用绝对值函数简化
{
if (a[j] - a[k]==0)
{
min = 0;
break;
}
else if ((a[j] - a[k]) > 0)
{
m_min = a[j] - a[k];
if (m_min < min)
{
min = m_min;
}
}
else if((a[j] - a[k] )< 0)
{
m_min = a[k] - a[j];
if (m_min < min)
{
min = m_min;
}
}
}
}
printf("%d\n", min);//循环结束后输出
return 0;
}
(2)方法二:先进行排序,后作差比较最小差值
#include<stdio.h>
#include<math.h>
int a[100000];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 2; i <= n; i++) {
int change = a[i];
int j = i - 1;
while (j >= 0 && a[j] > change) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = change;
}
int min = a[2] - a[1];
for (int i = 2; i <= n; i++) {
int ans = a[i] - a[i - 1];
if (min > ans) {
min = ans;
}
}
printf("%d", min);
return 0;
}