언어 자료구조 알고리즘/디딤돌 C언어

[정답] 디딤돌 C언어 67. 정리하기(함수)

언제나휴일 2016. 5. 1. 08:16
반응형

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


함수

52. 함수 개요 
53. 프로그램 생명 주기 
54. 프로세스 메모리 구조 
55. 프로그램 동작 원리 
56. 매개변수 전달 원리 
57. 전역 변수
58. 지역변수 
59. 정적 변수
60. 상수화 변수
61. 함수 만들기 실습 시나리오 
62. 도메인 분석 
63. 함수명 결정 
64. 함수 원형 결정 
65. 테스트 코드 작성하기
66. 구현 


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]);//교환
            }
        }
    }
}




반응형