Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 숫자가 특정 진법에 속하는지 확인하는 프로그램

문자열 형태의 숫자와 진법(base)이 주어졌을 때, 해당 숫자가 주어진 진법에 속하는지 판별하는 것이 이번 글의 목표입니다.

우리는 수 체계에 따라 숫자와 진법을 검사해야 합니다. 예를 들어 2진수의 밑은 2, 8진수의 밑은 8, 10진수의 밑은 10, 16진수의 밑은 16입니다. 따라서 문자열로 주어진 숫자가 특정 진법에 속하는지 확인하고, 속한다면 화면에 "Yes"를 출력하고 그렇지 않다면 "No"를 출력해야 합니다.

예를 들어 우리는 "1A6"이 16진수이고 "1010"이 2진수라는 것을 눈으로 보면 알 수 있습니다. 하지만 프로그램을 통해 이 문제를 해결하는 방법을 찾아야 합니다.

예시

입력: str = "1010", base = 2
출력: yes
입력: str = "1AA4", base = 16
출력: yes
입력: str = "1610", base = 2
출력: No

문제 해결 접근 방식

  • 진법이 2부터 16 사이에 있는지 먼저 확인합니다.
  • 그다음 문자열의 각 자릿수가 해당 진법에 유효한지 하나씩 검사합니다.
  • 모든 자릿수가 유효하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

알고리즘

Start
Step 1 -> 함수 bool isInGivenBase(char str[], int base)
    만약 base > 16이라면,
        false 반환
    그렇지 않고 base <= 10이라면,
    반복문 For i = 0, i < strlen(str), i++
        만약 !(str[i] >= '0' && str[i] < ('0' + base))라면,
            false 반환
    그 외의 경우 (base가 11~16인 경우),
    반복문 For i = 0, i < strlen(str), i++
        만약 NOT ((str[i] >= '0' && str[i] < ('0' + base)) ||
                  (str[i] >= 'A' && str[i] < ('A' + base - 10)))라면,
            false 반환
    true 반환
Step 2 -> 함수 int main()
    str[] = {"AF87"} 설정
    만약 isInGivenBase(str, 16)이 참이라면,
        "yes" 출력
    그렇지 않으면
        "No" 출력
Stop

구현 코드

#include <ctype.h>
#include <stdio.h>
#include <string.h>
bool isInGivenBase(char str[], int base) {
    // 허용되는 진법은 최대 16(16진수)까지입니다.
    if (base > 16)
        return false;
    // 진법이 10 이하라면 모든 자릿수는 0~9 범위여야 합니다.
    else if (base <= 10) {
        for (int i = 0; i < strlen(str); i++)
            if (!(str[i] >= '0' &&
                str[i] < ('0' + base)))
                return false;
    }
    // 진법이 16 이하라면 모든 자릿수는 0~9 또는 'A'부터 시작하는 영문자여야 합니다.
    else {
        for (int i = 0; i < strlen(str); i++)
            if (! ((str[i] >= '0' &&
                str[i] < ('0' + base)) ||
                (str[i] >= 'A' &&
                str[i] < ('A' + base - 10))
            ))
                return false;
    }
    return true;
}
// 드라이버 코드
int main() {
    char str[] = {"AF87"};
    if (isInGivenBase(str, 16))
        printf("yes\n");
    else
        printf("No\n");
    return 0;
}

실행 결과

yes

위 코드에서 "AF87"이라는 문자열과 16이라는 진법을 입력으로 사용했습니다. 함수 isInGivenBase는 각 문자가 16진수에서 유효한 값(0~9 또는 A~F)인지 검사하며, 모든 문자가 조건을 만족하므로 "yes"가 출력됩니다. 이러한 방식은 데이터 유효성 검사나 진법 변환 프로그램을 작성할 때 유용하게 활용할 수 있습니다.