[정답] 67. 정리하기 (함수)

1. 피보나치 수열의 n 항을 구하는 함수를 구현하시오.

//피보나치 수열의 n 항을 구하는 함수를 구현하시오.
#include <stdio.h>
 
int Fibonacci(int n);
int main(void)
{
    int i;
    for (i = 1; i <= 10; i++)
    {
        printf("%d ", Fibonacci(i));
    }
    printf("\n");
    return 0;
}
int Fibonacci(int n)
{
    if (n < 1)
    {
        return 0;
    }
    if ((n == 1) || (n == 2))
    {
        return 1;
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

2. 특정 구간 내에 n의 배수의 개수를 구하는 함수를 구현하시오.
답:

//특정 구간 내에 n의 배수의 개수를 구하는 함수
#include <stdio.h>
int CountMultiple(int n, int s, int e);
int main(void)
{
    printf("1~100사이에 6의 배수의 개수:%d\n", CountMultiple(6, 1, 100));
    return 0;
}
int CountMultiple(int n, int s, int e)
{
    int count = 0;
    for (; s <= e; s++)
    {
        if (s%n == 0)
        {
            count++;
        }
    }
    return count;
}

3. 1에서 n 사이의 수 중에서 랜덤한 수를 m개 발급하는 함수를 구현하시오.
답:

//1에서 n 사이의 수 중에서 랜덤한 수를 m개 발급하는 함수
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define MAX_RANDS   1000
 
int MakeRandom(int s, int n, int *base, int m);
int main(void)
{
    int arr[6];    
    int i;
    srand((unsigned)time(0));//랜덤 Seed 값 설정
    if (MakeRandom(1, 45, arr, sizeof(arr) / sizeof(arr[0])) == 0)
    {
        printf("생성 실패\n");
    }
    else
    {
        int asize = sizeof(arr) / sizeof(arr[0]);
        for (i = 0; i < asize; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    return 0;
}
int MakeRandom(int s, int n, int *base, int m)
{
    int check[32768] = { 0 };//발급 여부    
    int count = 0;
    int rval;
    int boundary;
 
    boundary = (n - s + 1);//s~n 사이의 수의 개수
    if (m > MAX_RANDS)//m이 최대 발급할 수 있는 개수보다 크면
    {
        return 0;//발급 실패 반환
    }
    if (m > boundary)//m인 범위의 수의 개수보다 크면
    {
        return 0;//발급 실패 반환
    }
    for (count = 0; count < m;count++)
    { 
        do  
        {
            rval = rand() % boundary + s;
        } while (check[rval]); //이미 발급한 수이면 반복
        check[rval] = 1;
        base[count] = rval;
    }
    return 1;    
}

4. 두 수의 최대 공약수를 구하는 함수를 구현하시오.
답:

//최대 공약수를 구하는 함수 작성
#include <stdio.h>
int FindGCD(int a, int b);
 
int main(void)
{
    int a, b;
    int lcm;
 
    printf("두 개의 정수 입력:");
    scanf_s("%d%d", &a, &b);
 
    lcm = FindGCD(a, b);
    if (lcm == -1)
    {
        printf("최대 공약수를 구할 수 없습니다.\n");
    }
    else
    {
        printf("%d와 %d의 최대 공약수는 %d\n", a, b, lcm);
    }
 
    return 0;
}
 
int FindGCD(int a, int b)
{
    int gcd;
    if (a > b)//a가 b보다 크면
    {
        //두 수를 교환
        int temp = a;
        a = b;
        b = temp;
    }
    for (gcd = a; ; gcd--)
    {
        if ((a%gcd==0)&&(b%gcd == 0))
        {
            return gcd;
        }
    }
    return -1;
}

5. 두 수의 최소 공배수를 구하는 함수를 구현하시오.
답:

//최소 공배수를 구하는 함수 작성
#include <stdio.h>
int FindLCM(int a, int b);
 
int main(void)
{
    int a, b;
    int lcm;
    
    printf("두 개의 정수 입력:");
    scanf_s("%d%d", &a, &b);
 
    lcm = FindLCM(a, b);
    if (lcm == -1)
    {
        printf("int 형식 표현 범위에서 최소 공배수를 구할 수 없습니다.\n");
    }
    else
    {
        printf("%d와 %d의 최소 공배수는 %d\n", a, b, lcm);
    }
 
    return 0;
}
 
int FindLCM(int a, int b)
{
    int lcm;
    if (a > b)//a가 b보다 크면
    {
        //두 수를 교환
        int temp = a;
        a = b;
        b = temp;
    }
    for (lcm = b; ; lcm += b)
    {
        if (lcm%a == 0)
        {
            return lcm;
        }
    }
    return -1;    
}

6. 두 수의 공약수의 개수를 구하는 함수를 구현하시오.
답:

//두 수의 공약수의 개수를 구하는 함수
#include <stdio.h>
int CountCD(int a, int b);
int main(void)
{
    int a, b;    
    printf("두 개의 정수 입력:");
    scanf_s("%d%d", &a, &b);
 
    if (a > b)//a가 b보다 크면
    {
        //두 수를 교환
        int temp = a;
        a = b;
        b = temp;
    }
    printf("%d와 %d의 공약수 개수:%d\n", a, b, CountCD(a, b));
 
 
    return 0;
}
int CountCD(int a, int b)
{
    int n;
    int count=0;
    for (n = 1; n <= a ; n++)
    {
        if ((a%n == 0) && (b%n == 0))//n이 a와 b의 약수일 때
        {
            count++;            
        }
    }
    return count;
}

7. 1부터 n 사이에 두 수의 공배수의 개수를 구하는 함수를 구현하시오.
답:

//1에서 n사이에 두 수의 공배수의 개수를 구하는 함수
#include <stdio.h>
int CountCM(int a, int b,int n);
int FindLCM(int a, int b);
int main(void)
{
    int a, b;
    printf("두 개의 정수 입력:");
    scanf_s("%d%d", &a, &b);
 
    if (a > b)//a가 b보다 크면
    {
        //두 수를 교환
        int temp = a;
        a = b;
        b = temp;
    }
    printf("%d와 %d의 공배수 개수:%d\n", a, b, CountCM(a, b,1000));
 
    return 0;
}
int CountCM(int a, int b,int n)
{
    int i;
    int count = 0;
    int lcm;
    lcm = FindLCM(a, b);
    for (i = lcm; i < n; i += lcm)
    {        
        count++;
    }
    return count;
}
int FindLCM(int a, int b)
{
    int lcm;
    if (a > b)//a가 b보다 크면
    {
        //두 수를 교환
        int temp = a;
        a = b;
        b = temp;
    }
    for (lcm = b; ; lcm += b)
    {
        if (lcm%a == 0)
        {
            return lcm;
        }
    }
    return -1;
}

8. 버블 정렬 알고리즘을 학습하여 n 개의 정수를 정렬하는 함수를 구현하시오.
답:

//버블 정렬
#include <stdio.h>
#define SWAP(x,y) {int temp; temp=x; x=y; y=temp;}
void bubbl_sort(int *base, int n);
int main(void)
{
    int arr[10] = { 34,23,66,89,22,12,90,26,37,68 };
    int i;
 
    bubbl_sort(arr, 10);
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}
void bubbl_sort(int *base, int n)
{
    int i, j;
    for (i = n; i > 1; i--)//정렬 범위를 좁히면서
    {
        for (j = 1; j < i; j++)//1에서 정렬 범위 i까지
        {
            if (base[j - 1]>base[j])//앞에 원소가 더 크면
            {
                SWAP(base[j - 1], base[j]);//교환
            }
        }
    }
}