문제

 정수 A와 B의 최대 공약수를 구하는 코드를 작성하세요.


위 문제를 해결하기 위해 우선 최대 공약수 정의에 대해 살펴보겠습니다.

최대 공약수란?

 - 두 정수 A,B의 공약수 중 가장 큰 수


공약수란?

 - 두 정수 A와 B가 공통으로 가지고 있는 약수


약수란? 

 - 두 정수 , 에 대하여 를 만족하는 정수 가 존재한다면,   약수라고 한다. 

 - 즉, 를 로 나누었을 때 나머지가 0이면, 를 의 약수라고 한다.


최대 공약수 예제를 반복문으로 해결하기 위해 다음 3가지를 정리해야 합니다.


1. 반복횟수 : 초기화, 조건식, 증감연산식을 결정

2. 규칙성 : 실행문을 결정

3. 반복문 종료 후 작업


1. 반복횟수

 - 두 정수의 최대 공약수를 찾기 위해서, 두 정수의 공약수를 찾아야 합니다.

 - 아래 내용을 보면 8과 12의 공약수를 구하는 과정이 나와 있습니다.

 - 아래와 같이 8보다 큰 9부터는 비교할 필요가 없습니다. 왜냐하면 9부터는 8을 나누었을 때 나머지가 8로 고정이기 때문입니다.

 - 따라서 반복횟수는 1부터 작은수까지 1씩 증가하면 됩니다.

 - 초기화 : i = 1

 - 조건식 : i <= 작은수

 - 증감연산식 : i++ 또는 ++i 또는 i+=1

8의 약수 : 1, 2, 4, 8

1

 2

 3

 4

6

7

10 

11 

12 

 나머지

0

 0

 2

 0

3

2

1

8

- 나머지 : 8를 i로 나누었을 때 나머지

12의 약수 : 1, 2, 3, 4, 6, 12

1

 2

 3

 4

6

7

8 

10 

11 

12 

 나머지

0

 0

 0

 0

0

5

4

3

2

- 나머지 : 12를 i로 나누었을 때 나머지


8과 12의 공약수 : 1, 2, 4

i 

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

11 

12 

mod A

0

0 

2 

0 

3 

2 

1 

0 

8 

8 

8 

mod B

0

0 

0 

0 

2 

0 

5 

4 

3 

2 

1 

0 


- mod A : 8를 i로 나누었을 때 나머지

- mod B : 12를 i로 나누었을 때 나머지



2. 규칙성 

 - i가 A와 B의 공약수이면 최대 공약수를 저장하는 변수에 i를 저장합니다.

 - 공약수를 작은 수부터 구하기 때문에 공약수들을 변수에 덮어쓰기를 하면 마지막에 남은 공약수는 가장 큰 공약수가 됩니다.

 - 조건식 : A를 i로 나누었을 때 나머지가 0과 (i가 A의 약수이다) B를 i로 나누었을 때 나머지가 0과 다(i가 B의 약수이다)

  => A % i == 0 && B % i == 0

 - 조건식 실행문 : 최대 공약수 변수에 i를 저장 => gcd = i


3. 반복문 종료 후 작업

 - 최대 공약수 gcd를 출력


정리한 내용을 바탕으로 소수 판별 예제 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main() {
    int A = 8, B = 12;
    //A와 B중 작은 수를 num에 저장
    int num = A>B?B:A;
    //최대 공약수
    int gcd = 1;
    //반복문에서 사용할 변수
    int i;
    for (i = 1; i <= num; i++) {
        if (A % i == 0 && B % i == 0) {
            gcd = i;
        }
    }
    printf("%d와 %d의 최대 공약수 : %d\n", A, B, gcd);
    
    return 0;
}



질문은 댓글로 남겨세요. 도움이 되셨다면 광고 클릭!

문제

 자연수 A가 소수인지 아닌지 판별하는 코드를 작성하세요.


위 문제를 해결하기 위해 우선 소수의 정의에 대해 살펴보겠습니다.

소수란?

 - 자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수이다. [출처1]

 - 즉, 약수가 2개인 1보다 큰 자연수


다음으로 약수의 정의에 대해 살표보겠습니다.

약수란? 

 - 두 정수 , 에 대하여 를 만족하는 정수 가 존재한다면,   약수라고 한다. [출처2]

 - 즉, 를 로 나누었을 때 나머지가 0이면, 를 약수라고 한다.


소수 판별 예제를 반복문으로 해결하기 위해 다음 3가지를 정리해야 합니다.


1. 반복횟수 : 초기화, 조건식, 증감연산식을 결정

2. 규칙성 : 실행문을 결정

3. 반복문 종료 후 작업


1. 반복횟수

 - 자연수 A가 소수인지 판별하기 위해서는 A의 약수를 찾아야 합니다. 

 - 즉, 1과 A사이에 있는 모든 자연수를 A로 나누어서 나머지가 0인지 확인해야합니다.

 - 따라서 반복횟수는 1부터 A까지 1씩 증가해야합니다.

 - 초기화 : i = 1

 - 조건식 : i <= A

 - 증감연산식 : i++ 또는 ++i 또는 i+=1


2. 규칙성 

 - 1과 A사이에 있는 자연수가 i라 할 때, i가 A의 약수이면 약수의 갯수를 증가시켜야 합니다.

 - 즉, A를 i로 나누었을 때 나머지가 0과 같다면 약수의 갯수를 증가시킵니다.

 - 조건식 : A를 i로 나누었을 때 나머지가 0과 같다 => A % i == 0

 - 조건식 실행문 : 약수의 갯수를 증가 => count++


3. 반복문 종료 후 작업

 - 반복문 종료 후 약수의 갯수가 2개이면 소수라고 출력합니다.

 - 반복문 종료 후 약수의 갯수가 2개가 아니면 소수가 아니라고 출력합니다.

 - 조건식 : 약수의 갯수가 2개이다 => count == 2

 - 조건식 실행문 : 소수라고 출력

 - else문 실행문 : 소수가 아니라고 출력


정리한 내용을 바탕으로 소수 판별 예제 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() {
    //자연수 A
    int A = 6;
    //약수의 갯수
    int count = 0;
    //반복문에서 사용할 변수
    int i;
    for (i = 1; i <= A; i++) {
        if (A % i == 0) {
            count++;
        }
    }
    if (count == 2) {
        printf("%d는 소수입니다.\n", A);
    }
    else {
        printf("%d는 소수가 아닙니다.\n", A);
    }
    return 0;
}


질문은 댓글로 남겨주세요.


출처

출처1. 위키백과, “소수(수론)”, 위키백과 , https://ko.wikipedia.org/wiki/%EC%86%8C%EC%88%98_(%EC%88%98%EB%A1%A0)

출처2. 위키백과, “약수”, 위키백과 , https://ko.wikipedia.org/wiki/%EC%95%BD%EC%88%98#%EC%A0%95%EC%9D%98

변수

학습 목표

  1. 변수를 선언할 수 있다.

  2. 콘솔에 변수값을 출력하고 입력 받을 수 있다.

표준 출력 함수 : printf

  • 문자열을 콘솔창에 출력하는 함수로 stdio.h 파일안에 있다.

    • 문자열은 쌍따옴표("") 안에 있는 문자들이 문자열이다.

    • 문자는 따옴표('')안에 있는 문자 1개가 문자이다.

  • 기본 사용 예시

    #include <stdio.h>
    int main(){
       printf("Hello world\n");
       return 0;
    }
  • printf함수로 변수값을 출력하기 위해선 서식문자가 필요하다.

    • 대표적인 서식 문자 종류

      서식문자자료형비고
      %c문자문자 출력
      %dint정수 출력
      %lldlong long정수
      %ffloat실수 출력
      %lfdouble실수 출력
      %schar 배열, 문자열문자열 출력
    • 문자열 안에 있는 서식문자 갯수 만큼 문자열 뒤에 ,와 값(상수 또는 변수 또는 식)이 와야 한다.

    • 예시


      #include <stdio.h>
      int main(){
         int num = 10, num2 = 20;
         char op = '/';
         double res = 0.5;
         //%.2lf는 소수점 둘째자리까지 출력
         //서식문자가 4개이므로 ,값이 4개 와야 한다.
         printf("%d %c %d = %.2lf\n",num1, op, num2, res);
         //출력 결과
         //10 / 20 = 0.50
         return 0;
      }

표준 입력 함수 : scanf

  • 콘솔에서 입력받은 값을 변수에 저장하는 함수로 stdio.h 파일안에 있다.

  • printf 함수는 문자열 안에 서식문자 수만큼 값이 와야 한다면 scanf는 서식문자 수만큼 주소가 와야 한다.

  • 주소 연산자 : &

  • 예시 - 한개씩 입력받는 예시

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main(){
       int num;
       char op;
       double res;
       printf("정수를 입력하세요 : ");
       scanf("%d",&num);
       printf("문자를 입력하세요 : ");
       /*
       문자 입력 시, 문자 입력하기 전 다른 변수를 입력받았다면 %c앞에 공백 필수,
       안넣으면 엔터가 자동으로 %c를 통해 op에 저장
       */
       scanf(" %c",&op);
       printf("실수를 입력하세요 : ");
       scanf("%lf",&res);
       printf("num = %d, op = %c, res = %.2lf\n", num, op, res);
       return 0;
    }
  • 예시 - 여러개 입력받는 예시

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main(){
       int num;
       char op;
       double res;
       printf("정수, 문자, 실수를 입력하세요 : ");
       scanf("%d %c %lf", &num, &op, &res);
       printf("num = %d, op = %c, res = %.2lf\n", num, op, res);
       return 0;
    }
  • scanf 사용 시 다음과 에러가 나오는 경우

    심각도 코드  설명  프로젝트    파일     비표시 오류(Suppression) 상태
    오류 C4996 'scanf': This function or variable may be unsafe.
    Consider using scanf_s instead. To disable deprecation,
    use _CRT_SECURE_NO_WARNINGS. See online help for details.
    • 원인 : 컴파일러 버전이 높아 scanf 대신 scanf_s함수를 사용하기를 권장

    • 해결방법

      • 방법1 : scanf_s 사용

      • 방법2: scanf를 사용하기 위해 다음 코드를 첫줄에 추가


        #define _CRT_SECURE_NO_WARNINGS


변수

학습 목표

  1. 변수를 선언할 수 있다.

  2. 콘솔에 변수값을 출력하고 입력 받을 수 있다.

변수

정의

  • 데이터를 저장하기 위한 물리적인 공간

변수 선언 방법

  • 문법

    자료형 변수명;
  • 예시

    int num1;              //정수형 변수 num1 선언
    int num2 = 10;      //정수형 변수 num2를 선언 후 10으로 초기화
    int num3 = 0x10//정수형 변수 num3을 선언 후 16진수 10으로 초기화(10진수로 16)
    int num4 = 010;   //정수형 변수 num4를 선언 후 8진수 10으로 초기화(10진수로 8)
    int num5 = 'A';     //정수형 변수 num5를 선언 후 A의 아스키 코드값 65로 초기화
    int num6 = 1.23;  //정수형 변수 num6를 선언 후 1로 초기화(0.23은 버려지며 경고가 뜸)
    char ch1 = 'A';      //문자형 변수 ch1를 선언 후 문자 A로 초기화
    char ch2 = 65;      //문자형 변수 ch2를 선언 후 아스키코드값 65에 해당하는 문자 A를 저장

자료형

  • 주요 자료형

    자료형크기(Byte)종류
    char1문자(정수)
    int4정수
    long long8정수
    float4실수
    double8실수
  • 정수형 자료형의 표현 범위

  • 실수형 자료형의 소수점 유효숫자

    • float : 7자리

    • double : 15자리

  • unsigned

    • 부호가 없는 이라는 의미로 정수형 변수 앞에 붙일 수 있으며 양수만 표현 가능

변수명 작성 규칙

  • 영어 대소문자, 숫자와 특수문자 일부만 사용 가능

    • 사용 가능 특수문자 : _ (언더바), $

    int _num; //가능
    int $num; //가능
    int #num; //에러
    int *num; //가능, 일반변수가 아닌 포인터 변수
  • 첫 글자는 숫자가 올수 없다

    int 1num;//에러
  • 대소문자를 구별한다.

    //다음 세 변수는 다 다른 변수이다.
    int num;
    int Num;
    int NUM;
  • 변수명 중간에는 공백을 입력할 수 없다.

    int nu m1;//에러
  • 중복된 변수를 선언할 수 없다.

    int num;
    int num;//에러 중복 선언
  • 변수명은 예약어를 사용할 수 없다.

    • 예약어는 컴파일러와 사용 방법이 약속된 단어

    • 사용 툴에 따라 다를 수 있지만 일반적으로 변수와 다른 색상을 가진다.

    int int;//에러 예약어 사용


+ Recent posts