티스토리 뷰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//printf() 함수와 scanf() 함수를 포함합니다
#include <stdio.h>
//system() malloc()함수를 포함합니다
#include <stdlib.h>
 
 
//OS 별 명렁어 설정
//_WIN32는 컴파일러에서 자동으로 추가해준다고 합니다.
#if defined(_WIN32) || defined(_WIN64)
//system 명령어를 CLEAR로 상요하기위해서 선언해줍니다.
#define CLEAR "cls"
//메모리 릭이 나오는지 확인해주는 라이브러리 입니다
//_CrtSetDbgFlag() 함수와 _CrtBreakAlloc() 함수가 있습니다.
#include <crtdbg.h>
//타 OS 용
#else
#define CLEAR "clear"
#endif
 
 
//유클리드 호제법으로 N개의 정수를 입력받아서
//최대공약수를 구하는 프로그램을 작성하겠습니다.
 
//사용자에게 정수의 갯수를 입력받을 변수 N 입니다.
int g_N = 0;
//포인터의 초기값을 NULL 로 잡겠습니다
//NULL 은 locale.h , stddef.h , stdio.h , stdlib.h , string.h , time.h , and wchar.h 선언 되있습니다
int* g_Narr = NULL;
int g_iIndex = 0//배열의 현재 인덱스
int g_iAnswer = 0//정답을 저장할 변수입니다.
 
//필요한 값들을 초기화하는 함수 입니다.
void Init();
int GCD(int _a, int _b); // 최대공약수를 구하는 함수
void Render(); //입력받은 정수들을 출력하는 함수 입니다.
 
//메인함수 입니다.
int main()
{
#if defined(_WIN32) || defined(_WIN64)
    //메모리릭이 생기는지 검사해주는 함수
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    //메모릭이 있는곳으로 가주는 함수
    //_CrtBreakAlloc();
#endif
 
    //필요한 값들을 초기화하는 함수입니다.
    //N의 갯수와 배열의 크기를 동적할당 하고
    //사용자로부터 정수들을 입력받습니다.
    Init();
 
    int* const pAnswer = &g_iAnswer; //정답변수를 가리키는 포인터
    int* const pNarr = g_Narr;    //배열 가리키는 포인터    
    //최대 공약수를 찾는 함수 입니다.
    //첫번째 정수와 두번째 정수 사이의 약수를 구한후
    //구한 약수로 다음 정수의 약수를 구해서 반복합니다.
 
    g_iIndex = 1//배열의 현재 인덱스를 1로 만들어줍니다.
    *pAnswer = GCD(pNarr[0], pNarr[1]);    //배열의 0번과 1번 인덱스의 정수를 넣어줍니다.
 
    Render();
    printf("최대공약수 :: %d\n"*pAnswer);
    //프로그램 종료전 메모리를 해제해줍니다.
    free(g_Narr);
    return 0;
// 메인함수의 종료
 
void Init()
{
    //사용자에게서 몃개의 정수를 입력 받을지 입력받겠습니다.
    printf("몃개의 정수를 입력하시겠습니까?\n");
    scanf("%d"&g_N);
 
    //전역변수를 지역번수에 저장하겠습니다.
    const int N = g_N;
    //입력받은 정수만큼 동적할당하여 배열을 선언해주겠습니다.
    g_Narr = (int*)malloc(sizeof(int* N);
    //전역변수를 지역변수에 저장하겠습니다.
    int* pNarr = g_Narr;    
 
    //생성된 배열에 정수들을 입력받겠습니다.
    for (int i = 0; i < N; ++i)
    {
        printf("%d. 번째 정수를 입력하세요.\n", i + 1);
        scanf("%d"&pNarr[i]);
    }
}
 
int GCD(int _a, int _b)
{
    const int* const pNarr = g_Narr;    //배열을 가리키는 포인터 입니다.
    int* const pIndex = &g_iIndex; //배열의 현재 인덱스를 저장합니다.
    //매개변수를 지역변수에 저장합니다
    const int a = _a;
    const int b = _b;
 
    int iLesser = 0//작은수를 저장할 변수
    iLesser = a > b ? b : a;    //a가 크면 b를 반환하고 b가 크면 a를 반환합니다.
    int iRemainder = 0;    //나머지를 저장할 변수
    iRemainder = a > b ? a % b : b % a;    //a와 b의 수를 비교해서 큰수를 작은수로 나누고 그 나머지를 반환합니다.
 
    if (iRemainder == 0)    //나머지가 0일경우 작은수를 반환합니다 그수가 최대 공약수 입니다.
    {
        ++(*pIndex);    //인덱스를 1 증가시킵니다
        //확인할 정수가 남아있다면 함수를 계속 실행하고 아니라면 iLesser를 리턴합니다
        //iLesser가 최대 공약수 입니다.
        return g_N > (*pIndex) ? GCD(iLesser, pNarr[(*pIndex)]) : iLesser;
    }
    return GCD(iLesser, iRemainder);
}
 
void Render()
{
    int* const pNarr = g_Narr;
    const int iSize = g_N;
    printf("입력받은 정수들 ::");
    for (int i = 0; i < iSize; ++i)
        printf("\t%d", pNarr[i]);    
    printf("\n");
}
 
cs


이번코드를 작성하면서 배운점

C는 C++와 다르기

sizeof로 동적할당받은 배열의 포인터를 넘겨주면

포터의 크기를 넘겨준다

C++에서는 동적할당한 배열의 포인터를 넘겨주면 포인터의 크기가아닌 배열의 총크기를 넘겨준다


C는 배열을 동적 할당할때 그 배열열의 길이를 따로 변수에 저장해주면 좋다.


재귀함수를 이용해서 N개의 정수를 입력받아 최대공약수를 구해보았습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함