티스토리 뷰
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개의 정수를 입력받아 최대공약수를 구해보았습니다.
'C > Console' 카테고리의 다른 글
_Generic() 과 <stdarg.h> 를 이용한 scanf() 랩핑하기 (0) | 2018.11.13 |
---|---|
함수포인터를 이용한 계산기 (0) | 2018.11.12 |
1부터 N까지의 곱을 구하는 수 (0) | 2018.11.12 |
학생관리 기록부 (0) | 2018.11.11 |
10개의 원소를 입력받아 정렬한뒤 출력 (0) | 2018.11.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Generic()
- C++
- flying bee
- responsive slider
- #비주얼스튜디오
- Visual Studio 2017
- SCSS @for
- 도매인 가격비교
- stdarg.h
- css slider
- fyling fly
- _Generic()
- 오류
- C11
- scanf()
- .editorconfig
- JS
- C
- HTML
- wxWidgets
- scss slider
- 도메인 가격비교
- CSS 슬라이더
- xgettext
- gettext
- dropdown list
- 1000 자리 계산기
- slider
- #C
- CSS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함