天天看点

*给定一个升序的整形数组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();

}