*给定一个升序的整形数组A以及两个整数x和k,要求输出数组A与x之差的绝对值最小的k个元素。若在与x差值的绝对值相等的两个元素,则取其中较小的元素

//*****************************************************************************************
//*给定一个升序的整形数组A以及两个整数x和k,要求输出数组A与x之差的绝对值最小的k个元素。若在与x差值的绝对值相等的两个元素,则取其中较小的元素
//*输入描述:输入的第一行为空格分隔的整形数组;第二行为空格分隔的两个整数x和k,数组长度不超过1000,数组元素绝对值和不超过1000,k大于0且不超过数组长度
//*输出描述:每组输入数据对应一行输出,输出数字间以空格分隔
//*实例:1 2 3 4 5
//         3 4
//*输出:2 1 0 1
//

//*****************************************************************************************

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)

void main()
{
    int a[1000],i,A,k,buff,max=0;
    //int *minv,*minl;
    for(i=0 ;;i++)
    {
        scanf("%d",a+i);
        //printf("%d", getchar());
        if (getchar() == 10)
        {
            break;
        }
    }
    scanf("%d",&A);
    scanf("%d",&k);
    int minl[1000];// = (int*)malloc(k * sizeof(int));
    int minv[1000]; //= (int*)malloc(k * sizeof(int));
    minl[0] = 0;
    minv[0] = abs(a[0] - A);
    int j;
    for (j = 1; j < k; j++)
    {
        minl[j] = j;
        minv[j] = abs(a[j] - A);
        if (minv[j] > minv[max])
        {
            max = j;
        }
    }
    for (int j = k; j < i; j++)
    {
        buff = abs(a[j]-A);
        if (buff == minv[max])
        {
            if (a[minl[max]] > a[j])
            {
                minl[max] = j;
                minv[max] = buff;
            }
        }
        else if (buff < minv[max])
        {
            minv[max] = buff;
            minl[max] = j;
        }
        for (int l = 0; l < k; l++)
        {
            
            if (minv[l] > minv[max])
            {
                max = l;
            }
        }
        
    }
    for (int i = 0; i < k; i++)
    {
        //int a = minl[i];
        printf("%d  ", a[minl[i]]);

    }
    getchar();
    getchar();
}

猜你喜欢

转载自blog.csdn.net/w1099384114/article/details/84960992
今日推荐