[C言語]小数を作成

7133 ワード

問題の説明


与えられた数字のうち3つの数字を小数に加算すると、個数を求めてみます.数値を持つ配列numsをパラメータとする場合は、solution関数を完了してnumsの3つの異なる数値の小数を返します.

せいげんじょうけん


numsに含まれる数字の個数は3個または50個を超えない.
numsの各要素は1000より大きい自然数であり、重複する数字は含まれていない.

I/O例


numsresult[1,2,3,4]1[1,2,7,6,4]4

I/O例説明


  • I/O例#1
    [1,2,4]を使用して7を作成できます.

  • I/O例#2
    [1,2,4]を使用して7を作成できます.
    [1,4,6]を使用して11を作成できます.
    [2,4,7]は、13を作成するために使用することができる.
    [4,6,7]を使用して17を作成できます.
  • コード実装

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    // nums_len은 배열 nums의 길이입니다.
    int solution(int nums[], size_t nums_len) {
        int answer = 0;
        int sum = 0;
        
        //배열에서 3개 골라서 더하는 반복문
        for(int i=0;i<nums_len;i++){
            for(int j=i+1;j<nums_len;j++){
                for(int k=j+1;k<nums_len;k++){
                    sum = nums[i]+nums[j]+nums[k];
                    int count = 0;
                    //약수의 개수를 구하는 반복문
                    for(int h=2;h<sum;h++){
                       if(sum%h==0)
                           count++;
                    }
                    if(count==0)
                        answer++;
                }
            }
        }
        return answer;
    }

    コードの説明


    3個の異なる数を加算するので,jとkはそれぞれi+1,j+1から始まることを指定する.
    3つの要素を加算してsumに格納し,sumの大きさに従って約数を繰り返す.このときhの値を2からsum-1まで指定します.1、少数の人だけが自分を持っているからです.
    count値が0でないことは、1と自身以外にも約数があることを示すので、countが0の場合にのみ答え値が1つ増加します.

    追加


    繰り返し文の使用回数を減らす方法があると思い、他の人のコードを探しました.
    しかし他の人も3回以上の繰り返し文を使い,異なる箇所があれば約数を判断する個数を別の関数として定義する.
    そして,他のコードを探すと,hの範囲はsum−1,(sum/2)+1まであまり長くないことが分かった.
    すなわち、コードで表す.
    for(int h=2;h<(sum/2)+1;h++){
    	if(sum%h==0)
        	count++;
    }
    if(count==0)
    	answer++;