cyphen156

Chapter6 과제 본문

프로그래밍/C언어

Chapter6 과제

cyphen156 2023. 8. 7. 15:46

개인 문제풀이임으로 오답이 있을 수 있습니다.

  1. 다음 중첩 루프의 실행 결과를 예측해 보고 실제 실행 결과를 출력하여 비교하라.
    for (i = 0; i < 3; i++) {
    	for (j = 3; j >= 1; j--) {
        	printf("%d %d\n, i, j);
        }
    }

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int i, j;
        for (i = 0; i < 3; i++) {
            for (j = 3; j >= 1; j--) {
                printf("%d % d\n", i, j);
            }
        }
        return 0;
    }
  2. 1부터 n까지의 합을 구하되 그 합이 입력 정수를 넘지 않아야 한다는 조건 하에서 최댓값을 구하라.
    > Enter a maximum number.
    > 1000(Enter)
    > The sum from 1 to 44 is 990.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n, sum = 0, i = 0;
    
        printf("Enter a maximum number.\n");
        scanf("%d", &n);
        while (sum + i < n) {
            i++;
            sum += i;
        }
        printf("The sum from 1 to %d is %d", i, sum);
        return 0;
    }
  3. 1부터 입력 정수 n까지의 합을 구하되 5의 배수는 제외한 합을 구하라. 단, 이 프로그램은 반드시 continue 문을 사용해야 한다.
    > Enter a natural number.
    > 6(Enter)
    > The sum is 16.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n, sum = 0;
    
        printf("Enter a natural number.\n");
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            if (i % 5 == 0)
                continue;
            sum += i;
        }
        printf("The sum is %d", sum);
        return 0;
    }
  4. 원주율 PI의 값은 PI = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - ···에 의해 구할 수 있다. 항의 개수가 늘어날수록 정밀도가 높아진다. 항의 개수를 입력받아 상응하는 정밀도로 파이 값을 구하는 프로그램을 작성하라.
    [hint] 셋째 항의 분모는 2 * 3 - 1에 의해 계산된다. 홀수 번째 항은 양수, 짝수 번째 항은 음수다.
    > Enter the number of terms.
    > 500(Enter)
    > PI evaluated to 500 terms is 3.139592655590.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n;
        double sum = 0.0f;
    
        printf("Enter the number of terms.\n");
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            if (i % 2 == 0)
                sum -= 4 / (2.0 * i - 1.0);
            else 
                sum += 4 / (2.0 * i - 1.0);
            
        }
        printf("PI evaluated to %d terms is %.12f.", n, sum);
        return 0;
    }
  5. 입력 자연수의 약수(factors)를 모두 출력하는 프로그램을 작성하라.
    > Enter a natural number.
    > 40(Enter)
    > 1 2 4 5 8 10 20 40
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int num;
        printf("Enter a natural number.\n");
        scanf("%d", &num);
        for (int i = 1; i < num; i++) {
            if (num % i == 0)
                printf("%d ", i);
        }
        return 0;
    }
     
  6. 자연수 a, b에 대해 a의 b 제곱을 돌려주는 함수를 작성하되 for loop을 사용해서 작성하라. 또, main에서 이 함수를 호출하여 결과를 출력하라.
    int power(int a, int b);

    > Enter base and power.
    > 2 7(Enter)
    > 2 to the power of 7 is 128.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int power(int a, int b);
    
    int main(void) {
        int a, b;
        printf("Enter a natural number.\n");
        scanf("%d %d", &a, &b);
        printf("%d to the power of %d is %d.", a, b, power(a, b));
        return 0;
    }
    
    int power(int a, int b) {
        if (b == 0)
            return 1;
        else
            return a * power(a, b - 1);
    }
     
  7. 자연수 n을 입력 받은 후 1 / n을 n번 더해서 출력하는 프로그램을 작성하라. 출력이 1이 아니면 왜 그런지 설명하라.
    > Enter the number of iteration.
    > 7(Enter)
    > 1/7 summed up 7 times is 0.9999999999998.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    // 미세 오차가 확인되지 않는 코드
    // int main(void) {
    //    int n;
    //    float sum = 0.0;
    //    printf("Enter the number of iteration.\n");
    //    scanf("%d", &n);
    //    for (int i = 1; i <= n; i++) {
    //        sum += 1.0 / n;
    //    }
    //    printf("1/%d summed up %d times is %f.\n", n, n, sum);
    //    return 0;
    //}
    
    // 오차 확인 가능한 코드
    int main(void) {
        int n;
        double sum = 0.0;
        double unit;
        printf("Enter the number of iteration.\n");
        scanf("%d", &n);
        unit = 1.0 / n;
        for (int i = 1; i <= n; i++) {
            sum += unit;
        }
        printf("1/%d summed up %d times is %.16f.\n", n, n, sum);
        return 0;
    }
  8. 9 + 99 + 999 + 9999 ···의합계를계산하는프로그램을작성하라.
    [hint] 99 = 9 * 10 + 9.    9999 = 99 * 10 + 9.
    즉 루프를 돌 때마다 이전 수에 10을 곱하고 거기에 9를 더한다.
    > Enter the number of terms.
    > 5(Enter)
    > The sum is 111105.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n, num = 0, sum = 0;
    
        printf("Enter the number of terms.\n");
        scanf("%d", &n);
    
        for (int i = 0; i < n; i++) {
            num = 10 * num + 9;
            sum += num;
        }
        printf("The sum is %d.\n", sum);
        return 0;
    }
  9. 0부터 9999 사이의 숫자를 입력받아 각 자릿수의 합을 계산하는 프로그램을 작성하라. 예를 들어 1325가 들어오면 숫자의 합은 1 + 3 + 2 + 5 = 11이 되어야 한다.
    [hint] 몫이 0보다 클 동안 계속해서 10으로 나눈 나머지를 더해야 한다.
    > Enter the number.
    > 1325(Enter)
    > The sum is 11.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n, sum = 0;
    
        printf("Enter the number.\n");
        scanf("%d", &n);
        if (n < 0 || n >= 10000){
            pritnf("잘못된 수를 입력했습니다. 프로그램을 종료합니다.\n");
            return 0;
        }
        while (n > 0) {
            sum += n % 10;
            n /= 10;      
        }
        printf("The sum is %d.\n", sum);
        return 0;
    }
  10. 삼각형의 밑변, 높이, 빗변을 각각 a, b, c라고 했을 때 피타고라스 정리에 의하면 a² + b² = c²이라는 등식이 성립해야 직각 삼각형이다. a, b, c를 모두 입력 숫자 N보다 작거나 같다고 가정할 때 직각 삼각형이 될 수 있는 자연수 a, b,  c를 모두 나열하라. 단, 3, 4, 5와 4, 3, 5는 서로 다른 경우로 취급한다.
    [hint] 3중 for 루프를 사용한다.
    > Enter the maximum length N.
    > 7(Enter)
    > The right-angled triangles are,
    > 3 4 5
    > 4 3 5
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int N;
    
        printf("Enter the maximum length N.\n");
        scanf("%d", &N);
    
        printf("The right-angled triangles are,\n");
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                for (int k = 1; k <= N; k++) {
                    if (i * i + j * j == k * k)
                        printf("%d %d %d\n", i, j, k);
                }
            }
        }
        return 0;
    }
  11. '서로 소'(Mutually Prime)는 1 이외에는 공약수가 없는 상태를 말한다. 예를 들어 5와 11은 1 이외에는 공약수가 없으므로 서로 소다. 두 정수 a, b가 인자로 전달될 때 서로 소라면 문자 'y'를, 그렇지 않으면 문자 'n'을 리턴하는 함수를 작성하고 main에서 그것을 불러 결과를 출력하는 프로그램을 작성하라.
    [hint] 2부터 a, b 중 작은 수까지만 루프를 돌리면서 어느 순간이라도 공약수가 있으면 곧바로 'y'를 리턴한다. 그렇지 않으면 끝까지 루프를 돈 다음에 빠져나와서 'n'을 리턴한다.
    문제 설명과 힌트가 맞지 않습니다 출력문을 한번 꼬아서 출력시키거나 힌트를 수정해서 공약수가 있다면 'n', 없다면 'y'를 리턴하는것으로 수정하여 푸세요
    저는 수정해서 풀엇습니다.
    char mutually_prime(int a, int b);
    > Enter two numbers.
    > 5 11(Enter)
    > They are mutually prime.
    #define _CRT_SECURE_NO_WARNINGS
    // 서로소 판별 -> 우선 공약수 1은 제외
    #include <stdio.h>
    
    char mutually_prime(int a, int b);
    
    int main(void) {
        int a, b;
        char c;
    
        printf("Enter two numbers.\n");
        scanf("%d %d", &a, &b);
    
        c = mutually_prime(a, b);
        if (c == 'y')
            printf("They are mutually prime.");
        return 0;
    }
    
    char mutually_prime(int a, int b) {
        int min = a < b ? a : b;
        for (int i = 2; i <= min; i++) {
            if (a % i == 0 && b % i == 0)
                return 'n';
        }
        return 'y';
    }
  12. 숫자 5를 입력했을 때 실행결과다. 홀수 n을 입력받아서 이러한 모습을 화면에 출력하는 프로그램을 작성하라. 단, 하나의 프로그램에서 세 가지 모습을 연이어 출력해야 한다.
    [hint] 2중 for 문을 사용하되 바깥쪽 for의 인덱스 i는 몇 줄을 찍을 것인지를 제어하고 안쪽 for의 인덱스 j는 그 줄의 내용을 어떻게 찍을 것인가를 제어하되 i, j 값을 서로 연관시켜야 한다.
    Enter the number.
    5
    *
    **
    ***
    ****
    *****
    1
    12
    123
    1234
    12345
      *
     ***
    *****
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n;
    
        printf("Enter the number.\n");
        scanf("%d", &n);
    
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                printf("*");
            }
            printf("\n");
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                printf("%d", j);
            }
            printf("\n");
        }
        // 등차 수열을 사용하여 출력문의 인덱싱을 제어합니다
        for (int i = 1; 2 * i - 1 <= n; i++) {
            for (int j = 1; 2 * j <= n - (2 * i)+1; j++) {
                printf(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                printf("*");
            }
            printf("\n");
        }
        return 0;
    }
  13. 자아도취 수(Narcissistic Number, Armstrong Number)는 각각의 자릿수에 총 자릿수의 제곱수를 취해 더한 숫자와, 원래의 숫자가 동일한 경우를 말한다. 예를 들어, 153 = 1³ + 5³ + 3³, 1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴이므로 자아도취 수다. 입력 숫자가 주어지면 그것이 자아도취 수인지를 판별하는 프로그램을 작성하라. 
    [hint] 루프를 돌면서 몇 자리 수인지를 먼저 계산한 후 다시 루프를 돌면서 합을 구한다.
    int narciss(int n); // returns 1 if narcissistic number
    > Enter a number.
    > 1634(Enter)
    > Yes, 1634 is a narcissistic number.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int calcLen(int n); // 자릿수 구하기
    int power(int n, int len);    // 제곱
    int narciss(int n); // returns 1 if narcissistic number
    
    int main(void) {
        int n;
    
        printf("Enter a number.\n");
        scanf("%d", &n);
    
        if (narciss(n)) {
            printf("Yes, %d is a narcissistic number.\n", n);
        }
        else {
            printf("No, %d is not a narcissistic number.\n", n);
        }
        return 0;
    }
    
    int calcLen(int n) {
        int len = 0;
        while (n != 0) {
            n /= 10;
            len++;
        }
        return len;
    }
    
    int power(int n, int len) {
        if (len == 0)
            return 1;
        else
            return n * power(n, len - 1);
    }
    
    int narciss(int n) {
        int len = calcLen(n);
        int temp = n;
        int sum = 0;
        while (temp != 0) {
            int digit = temp % 10;
            sum += power(digit, len);
            temp /= 10;
        }
        return (sum == n);
    }
  14. 입력 자연수의 자릿수를 반대로 출력하는 프로그램을 작성하라. 예를 들어 1267을 입력하면 7621을 출력해야 한다. 단, 이 프로그램은 0이나 음수가 입력될 때 까지 계속 반복되어야 한다.
    [hint] 주어진 수를 10으로 나눈 나머지를 출력한다. 10으로 나눈 몫에 대해 이 과정을 반복하되 몫이 0이면 빠져나온다.
    void reverse_it(int num);
    Enter a natural number.
    1267
    7621
    Enter a natural number.
    12345
    54321
    Enter a natural number.
    0
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    void reverse_it(int num);
    
    int main(void) {
        int n;
    
        while (1) {
            printf("Enter a natural number.\n");
            scanf("%d", &n);
            if (n <= 0)
                break;
            reverse_it(n);
            printf("\n");
        }
        return 0;
    }
    
    void reverse_it(int num) {
        while (num != 0) {
            int k = num % 10;
            num /= 10;
            printf("%d", k);
        }
    }
  15. 일련의 자연수를 입력받아 지속적으로 평균값을 출력하는 프로그램을 작성하라. 단, 0이나 음수가 입력되면 프로그램을 종료한다. 반드시 while 루프를 사용해야 하며 평균값은 소수 이하 셋째 자리까지 표시해야 한다. 단, 처음부터 0이나 음수가 들어오면 곧바로 프로그램을 종료해야 한다.
    > Enter a natural number.
    > 4(Enter) 
    > Current avverage is 4.000.
    > Enter a natural number.
    > 2
    > Current average is 3.000.
    > Enter an integer. // 출력문이 잘못된것 같습니다 예외처리하면 되기는 하는데 그냥 "Enter a natural number."로 변경하겟습니다.
    > -1(Enter)
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int len = 0;
        double n, sum = 0.0f, avg = 0.0f;
    
        while (1) {
            printf("Enter a natural number.\n");
            scanf("%lf", &n);
            if (n <= 0)
                break;
            sum += n;
            len++;
            avg = sum / len;
            printf("Current avverage is %.3lf\n", avg);
        }
        return 0;
    }
  16. 키보드에서 입력한 모든 숫자는 문자로 읽힌다. 예를 들어, 숫자 23을 치더라도 그것은 문자 '2', '3'으로 읽힌다. stdlib.h에 선언된 atoi(alphanumeric to integer) 함수는 문자열을 숫자로 변환하는 함수다. 따라서 scanf가 %d 형식으로 읽을 때 이 함수가 자동으로 호출되어 23이라는 숫자로 변환된다. atoi함수의 신세를 지는 대신 직접 짤 수도 있다. main에서 루프를 돌면서 scanf("%c", &ch);를 써서 숫자를 개별 문자 형태로 읽은 후 그것을 정수로 변환하여 출력하는 것이다. 빈 줄을 채워 이 프로그램을 완성해 보라.
    #include <stdio.h>
    
    int main() {
    	char ch; int sum = 0;
        int value;	// 문자 하나를 0..9 사이의 숫자로 변환하여 저장하는 변수
        printf("Enter a natural number.\n");
        while (1) {
        	scanf("%c", &ch);
            ___________________	// ch가 엔터키('\n')와 같으면 빠져나감
            ___________________	// value 값 설정. 아스키 값 48('0')이 숫자 0
            ___________________	// sum 값 설정. 이전 sum에 10을 곱한 후 value를 더함
        }
        printf("You entered %d in decimal.\n", sum);
      	return 0;
    }
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main() {
        char ch; int sum = 0;
        int value;
        printf("Enter a natural number.\n");
        while (1) {
            scanf("%c", &ch);
            if (ch == '\n')
                break;
            if (ch < '0' || ch > '9') {
                printf("잘못된 입력입니다 숫자를 입력해주세요.\n");
                return 1;
            }
            value = ch - '0';
            sum = sum * 10 + value;
        }
        printf("You entered %d in decimal.\n", sum);
        return 0;
    }
  17. 상태 변화를 추적함으로써 입력 문장에서 전치사 in이 몇 번 나오는지 판단하여 출력하는 프로그램을 작성하라.
    [hint] state 값이 0이면 wait state, 1이면 'i'가 입력된 상태, 2이면 'i', 'n'까지 입력된 상태, 이후 빈칸(' ')이 입력되어야 한 번 나온 것이다. 예제를 참고하라.
    > Enter a sentence.
    > I am interested in individual income in vintage market.(Enter)
    > The preposition 'in' appears 2 times.ㅇ
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        char ch;
        int state = 0, n = 0;
        printf("Enter a sentence.\n");
    
        while (1) {
            scanf("%c", &ch);
            if (ch == '\n')
                break;
            if (ch == 'i') {
                state = 1;
                continue;
            }
            if (state == 1 && ch == 'n') {
                state = 2;
                continue;
            }
            if (state == 2 && ch == ' ') {
                n++;
                state = 0;
                continue;
            }
            else
                state = 0;
        }
        printf("The preposition 'in' appears %d times.\n", n);
        return 0;
    }
  18. 씨저 사이퍼(Caesar Cipher)는 암호화 방법 중 하나로서 문자를 몇 칸 건너뛴 나중 문자로 대체하는 방법이다. 예를 들어, 한 칸 나중 문자로 암호화할 경우 'attack at dawn'은 'buubdl!bu!ebxo'로 암호화할 수 있다. 아스키코드 표의 a 다음의 문자가 b이며 빈칸 다음 문자가 !이기 때문이다. 이 방법에서는 몇 칸을 건너뛰었는가가 바로 암호를 풀 수 있는 키(Key)라 할 수 있다. 키와 문자열을 입력받아 문자열을 암호화하는 프로그램을 작성해 보라. 단, 아스키 문자는 0부터 127 사이에 분포하므로 이 범위를 넘지 않게 하려면 암호화 결과에 모듈로(%) 128을 가해야 한다.
    [hint] 입력 버퍼에 쌓인 문자를 scanf("%c", &ch);를 써서 읽되 루프를 돌면서 하나씩 읽어야 한다. '\n'이 들어오면 빠져나가고 그렇지 않으면 암호화된 문자를 출력한다.
    > Enter the key.
    > 3(Enter)
    > Enter the text.
    > I like spring.(Enter)
    > L#olnh#vsulqj1
    #define _CRT_SECURE_NO_WARNINGS
    
    // 시저 사이퍼
    // 고대 로마 제국 율리우스 카이사르 시대에 사용하던 암호화 기법
    // 초기 암호화, 문자를 대체
    #include <stdio.h>
    
    int main(void) {
        int key;
        char ch;
    
        printf("Enter the key.\n");
        scanf("%d", &key);
        printf("Enter the text.\n");
        getchar();	//key값 입력시 같이 버퍼에 입력된 '\n'(Enter)제거
    
        while (1) {
            scanf("%c", &ch);
            if (ch == '\n')
                break;
            printf("%c", ch + key);
        }
        return 0;
    }
  19. 입력 문장에서 영어 모음이 몇 번 나오는지를 판단하여 출력하는 프로그램을 작성해 보라.
    > Enter a sentence.
    > What a beautiful day.(Enter)
    > Vowel appears 8 times.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        int n = 0;
        char s[1000];
    
        printf("Enter a sentence.\n");
        fgets(s, sizeof(s), stdin);
        for (int i = 0; s[i] != '\0'; i++) {
            if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i'
                || s[i] == 'o' || s[i] == 'u')
                n++;
        }
        printf("Vowel appears %d times.", n);
        return 0;
    }
  20. 새로운 아이디를 만들 때 규칙은 다음과 같다. 첫째, 알파벳 소문자로 시작해야 한다. 둘째, 반드시 숫자가 하나 이상 들어가야 한다. 셋째, 최대 8자리라야 한다. 입력 아이디가 이 규칙에 들어맞는지를 판단하는 프로그램을 작성하라.
    [hint] 엔터 키를 만날 때까지 scanf로 한 글자씩 읽으면서 규칙을 적용하라.
    > Enter an identifier.
    > meat4U(Enter)
    > It's a legal ID.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void) {
        char ch;
        int len = 0, isNum = 0, head = 0;
    
        printf("Enter an identifier.\n");
        while (1) {
            scanf("%c", &ch);
            if (ch == '\n')
                break;
            if (len == 0 && ch >= 'a' && ch <= 'z') {
                head = 1;
            }
            if (ch >= '0' && ch <= '9') {
                isNum = 1;
            }
            len++;
        }
        if (isNum == 1 && len <= 8 && head == 1)
            printf("It's a legal ID.\n");
        else
            printf("It's a Unlegal ID.\n");
        return 0;
    }
  21. 2진수를 10진수로 변환하는 프로그램을 작성하라. 단, main은 입력 2진수를 long long 타입의 10진수로 선언하고 scanf("%lld") 형식으로 읽어야 한다. 이후 아래 함수를 호출해야 한다. 이 함수 내부에서 math.h에 선언된 double pow(double x, double y);를 써서 x의 y승을 계산하되 결과 값을 int 타입으로 변환해야 한다.
    int bin_to_dec(long long n);
    [hint] 2진수를 10으로 나눈 나머지에 자리 수에 해당하는 2의 승수를 곱하되 루프를 돌면서 계속 더해야 한다.
    > Enter a binary number.
    > 11010000(Enter)
    > The decimal value of binary 11010000 is 208.
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int bin_to_dec(long long n);
    
    int main(void) {
        long long int n;
    
        printf("Enter a binary number.\n");
        scanf("%lld", &n);  // 입력을 한글자 단위가 아닌 전체 숫자로 받겟다는 소리입니다
                            // ex 11011110101010111101101
        printf("The decimal value of binary %lld is %d.", n, bin_to_dec(n));
        return 0;
    }
    
    int bin_to_dec(long long n) {
        int result = 0, base = 1;
        while (n > 0) {
            int remainder = n % 10;
            result += remainder * base;
            base *= 2;
            n /= 10;
        }
    
        return result;
    }
     
  22. 변형이 있을 수 있지만 일반적인 369 게임의 규칙은 다음과 같다. 숫자에 3이나 6이나 9가 들어가면 369 수다. 그 경우에 그것이 들어간 개수만큼 박수를 친다. 예를 들어, 36은 박수를 두 번 친다. 그 외의 숫자는 박수를 치지 않고 숫자를 말하면 된다. 1부터 입력 N까지 숫자에 대해 369 게임을 할 경우의 출력을 작성하라.
    [hint] 몫이 0이 될 때까지 계속해서 10으로 나누어 가면서 나머지가 369 수인지를 확인하여 박수를 몇 번 쳐야 하는지를 먼저 계산하라.
    > Enter a number.
    > 20(Enter)
    > 1 2 ! 4 5 ! 7 8 ! 10 11 12 ! 14 15 ! 17 18 ! 20
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int clac_len(int n);
    
    int main(void) {
        int n;
    
        printf("Enter a number.\n");
        scanf("%d", &n);
    
        for (int i = 1; i <= n; i++) {
            int len = clac_len(i);
            int temp = i;
            int clap = 0;
            for (int j = 0; j < len; j++) {
                int digit = temp % 10;
                if (digit == 3 || digit == 6 || digit == 9) {
                    clap++;
                }
                temp /= 10;
            }
            if (clap > 0) {
                for (int k = 0; k < clap; k++) {
                    printf("!");
                }
            }
            else {
                printf("%d", i);
            }
            printf(" ");
        }
        return 0;
    }
    
    int clac_len(int n) {
        int result = 0;
        while (n > 0) {
            n /= 10;
            result++;
        }
        return result;
    }

//모든 예제 소스는 한빛 미디어홈페이지에서 찾으실 수 있습니다.

IT CookBook, 전공자를 위한 C 언어 프로그래밍 (hanbit.co.kr)

또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.

 

 

 

 

 

'프로그래밍 > C언어' 카테고리의 다른 글

Chapter7 과제  (0) 2023.08.24
Chapter7 : 디버깅과 소프트웨어 설계  (0) 2023.08.08
Chapter6 반복문 : for와 while  (0) 2023.07.12
Chapter5 과제  (0) 2023.06.21
Chapter5 조건문 : If와 Switch  (0) 2023.06.02