[C言語]白駿2108:統計学



構想

  • 算術平均->sum=sum+arr[i]すべてsumに格納してsum/nを行えば良いのですが、小数点の位置に注意が必要なのでdoubleを使います.小数点以下の桁数を検索してみましょう.
  • 中央値->負の選択順に昇順に使用し、n/2は中央値であり、出力すべきである.
  • 最安値->一日中考えていました.まず最も多くの値を出力し,2つ目の場合は後で考える.
  • レンジ->選択したソートをarr[0]とarr[n-1]と区別すると、レンジがあります.
  • 私が初めて解いた謎(間違い)

    #include <stdio.h>
    
    int ft_rep(int arr[], int n)
    {
        int i;
        int rep[8001];
        int max, mode = 0;
        i = 0;
        while (i < n)
        {
            rep[arr[i]]++; // rep에 arr[i]를 집어넣고 ++로 세줌
            i++;
        }
        max = 0;
        i = 0;
        while (i < n)
        {
            if (rep[arr[i]] > max)
            {
                max = rep[arr[i]];
                mode = arr[i]; // max값 찾고, 그 지점 mode로 저장
            }
            i++;
        }
        return mode;
    }
    
    int ft_aver(int arr[], int n)
    {
        int i;
        int sum = 0;
        i = 0;
        while (i < n)
        {
            sum = sum + arr[i];
            i++;
        }
        return sum;
    } // sum을 계산
    
    void ft_swap(int arr[], int i, int j)
    {
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    void ft_sort(int arr[], int n) // 선택정렬
    {
        int i, j;
        i = 0;
        while (i < n - 1)
        {
            j = i + 1;
            while (j < n)
            {
                if (arr[i] > arr[j])
                    ft_swap(arr, i, j);
                j++;
            }
            i++;
        }
    }
    
    int main()
    {
        int n, i;
        scanf("%d", &n);
        i = 0;
        int arr[n];
        double dsum;
        while (i < n)
        {
            scanf("%d", &arr[i]);
            i++;
        }
        
        dsum = ft_aver(arr , n);
        dsum = dsum / n;
        printf("%.0f\n", dsum); // 1번
        ft_sort(arr, n);
        printf("%d\n", arr[n / 2]); // 2번
        printf("%d\n", ft_rep(arr, n));
        printf("%d\n", arr[n - 1] - arr[0]); // 4번
        i = 0;
    }
    ここまで言うと、最低価格はどう計算すればいいか本当に分かりません.
    結局グーグルで答えを見ましたが、まだ理解できません.疲れた.
    ああ、そして選択ソートを使うとタイムアウトするそうです.
    明日はクイックソート(内蔵関数)を勉強します.最適値を再理解することを目標としています.

    翌日出力1.2.4万

    #include <stdio.h>
    #include <stdlib.h>
    
    int arr[500001];
    
    int compare(const void *a, const void *b)
    {
        int num1 = *(int *)a;
        int num2 = *(int *)b;
    
        if (num1 < num2)
            return -1;
        if (num1 > num2)
            return 1;
        return 0;
    }
    
    int main()
    {
        int i, n;
        int sum = 0;
        scanf("%d", &n);
        i = 0;
        while (i < n)
        {
            scanf("%d", &arr[i]);
            sum = sum + arr[i];
            i++;
        }
        qsort(arr, n, sizeof(int), compare);
        printf("%.0f\n", sum / (double)n);
        printf("%d\n", arr[n / 2]);
        printf("%d\n", arr[n - 1] - arr[0]);
    }
    最低価格を除いて、ペーストは本当に短いです.

    NULL値を含む解答

    #include <stdio.h>
    #include <stdlib.h>
    
    int arr[500001];
    int count[8001];
    
    int compare(const void *a, const void *b)
    {
        int num1 = *(int *)a;
        int num2 = *(int *)b;
    
        if (num1 < num2)
            return -1;
        if (num1 > num2)
            return 1;
        return 0;
    }
    
    int maxFinder(int arr[], int size_arr)
    {
        int max = arr[0];
        int i = 0;
        while (i < size_arr)
        {
            if (max < arr[i])
                max = arr[i];
            i++;
        }
        return max;
    }
    
    int main()
    {
        int i, n;
        int sum = 0, mode = 0, flag = 0;
        scanf("%d", &n);
        i = 0;
        while (i < n)
        {
            scanf("%d", &arr[i]);
            sum = sum + arr[i];
            count[arr[i] + 4000]++;
            i++;
        }
        i = 0;
        while (i < 8001)
        {
            if (maxFinder(count, 8001) == count[i])
            {
                flag++;
            }
            i++;
        }
        i = 0;
        while (i < 8001)
        {
            if (flag == 1)
            {
                if (maxFinder(count, 8001) == count[i])
                {
                    mode = i - 4000;
                    break;
                }
            }
            else
            {
                if (maxFinder(count, 8001) == count[i])
                {
                    if (flag == 0)
                    {
                        mode = i - 4000;
                        break;
                    }
                    else
                        flag = 0;
                }
            }
            i++;
        }
        qsort(arr, n, sizeof(int), compare);
        printf("%.0f\n", sum / (double)n);
        printf("%d\n", arr[n / 2]);
        printf("%d\n", mode);
        printf("%d\n", arr[n - 1] - arr[0]);
    }
    ここでhttps://mjeong9316.tistory.com/172の助けを得ました.
    簡単に説明すると、絶対値は4000を超えないので、8001に設定します.これは、最大値を設定すると負の値が歪むためです.
    したがってiは0から8000まで戻り,+4000で負数を正数にし,最空値を探す.
    次に、最大値が見つかったらflagを設定します.
    flagが1の場合、最大値は1つしかないので、最初に追加した4000を減算して出力します.1より大きい場合は複数の最大値を表し、最初の最大値が現れる場合はflag=0、2番目の最大値が現れる場合はflag=0、breakとなります.
    しかし、このコードをコミットすると85%がエラーになります.比較を続けて、いっそ同じコードを置いても見ましたが、ずっと間違っていました.8回試したようですが...どこが間違っているのか分かりません.

    最終コミットコード


    https://sedangdang.tistory.com/19
    この人をコピーしただけです.
    論理も比較したが、どこが問題なのか分からない.
    コレクションができた以上、また今度見ましょう.この問題はどれくらい時間がかかったかわからない.
    確かに、負の数を正の数に変えてから、その値を減らす考えは確かにいいですね.
    また、int型にそれぞれ0.5を入れる方法が不思議です.