首页 > 解决方案 > 我们如何在 C 编程中将 10 的数组中最大的 5 个数字替换为 1,将最小的 5 替换为 0?

问题描述

这是我的老师给我的问题

编写一个 C 程序,将 10 个整数存储在一个大小为 10 的数组中,并显示该数组的内容。将数组中最高的 5 个数字替换为 1,将最低的 5 个数字替换为 0,并显示新数组的内容。[例如原始阵列 44 11 6 99 30 78 32 31 66 55 新阵列 1 0 0 1 0 1 0 0 1 1

我整天都在为这个问题苦苦挣扎:(

标签: arraysc

解决方案


有很多方法可以解决这个问题。一个好的方法是将数组排序到另一个数组中,然后用 0 替换前半部分,用 1 替换后半部分,如下所示:

#include<stdio.h>

int main(){
    const int arraySize = 10;
    int i, j;
    int arr[arraySize];
    int arrSorted[arraySize];
    int temp;

    // Get input from user
    printf("Please enter 10 numbers!\n");
    for (i = 0; i < arraySize; i++)
    {
        scanf("%d", &arr[i]);
        // Copy array into another to sort it later
        arrSorted[i] = arr[i];
    }
    
    // Print input
    printf("Input:  ");
    for (i = 0; i < arraySize; i++)
    {
        printf("%3d ", arr[i]);
    }
    printf("\n");


    //Sort the array in ascending order
    for (i = 0; i < arraySize; i++) 
    {
        for (j = i + 1; j < arraySize; j++) 
        {
           if(arrSorted[i] > arrSorted[j]) 
           {
               temp = arrSorted[i];
               arrSorted[i] = arrSorted[j];
               arrSorted[j] = temp;
           }
        }
    }

    // Start replacing procedure
    for (i = 0; i < arraySize; i++)
    {
        for (j = 0; j < arraySize; j++)
        {
            if (arr[j] == arrSorted[i])
            {
                if (i < arraySize / 2) // Replace 1st half with 0s
                {
                    arr[j] = 0;
                }
                else                   // Replace 2nd half with 1s
                {
                    arr[j] = 1;
                }
                break;
            }
        }
    }

    // Print result
    printf("Result: ");
    for (i = 0; i < arraySize; i++)
    {
        printf("%3d ", arr[i]);
    }
    printf("\n");

    return 0;
}

当然,如果您不想自己排序,可以使用 C 标准库的 qsort() 函数。

另一种解决方案是,找到数组的中位数,然后将小于它的任何数字替换为 0,将任何大于它的数字替换为 1。尽管使用此解决方案,关于如何处理中位数本身会有一些挑战如果有多个中位数(重复)怎么办?


推荐阅读