Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

文字列として与えた数値が指定した基数に属するかどうかを判定するC言語プログラム

数値を文字列として受け取り、その数値が指定された基数(base)に属しているかどうかを判定するのが本記事の目的です。

私たちが普段扱う記数法には、2進数(基数2)、8進数(基数8)、10進数(基数10)、16進数(基数16)などがあります。この仕組みをもとに、文字列として与えられた数値が特定の基数に属するかどうかを調べます。もし属していれば出力画面に「Yes」を表示し、属していなければ「No」を表示します。

たとえば「1A6」という数式は基数16(16進数)に属し、「1010」は基数2(2進数)に属します。人間であれば見た目で判断できますが、これをプログラムで自動的に判定する方法を考えてみましょう。

入力例と出力例

Input: str = "1010", base = 2
Output: yes

Input: str = "1AA4", base = 16
Output: yes

Input: str = "1610", base = 2
Output: No

問題を解くためのアプローチ

  • まず、基数が2から16の範囲内にあるかどうかを確認します。
  • 次に、文字列の各桁(各文字)がその基数で使用可能な文字であるかを1つずつ検証します。
  • すべての桁が有効であれば true を返し、1つでも無効な文字があれば false を返します。

基数ごとに使用できる文字

基数10以下の場合は「0」〜「9」の数字のみが使用できます。一方、基数11以上の場合は数字に加えて「A」以降の英字も使用できます。たとえば基数16では「0〜9」と「A〜F」が有効な文字となります。

アルゴリズム

Start
Step 1 -> 関数 bool isInGivenBase(char str[], int base)
    If base > 16 then,
        Return false
    Else if base <= 10 then,
        Loop For i = 0 and i < strlen(str) and i++
            If !(str[i] >= '0' and str[i] < ('0' + base)) then,
                Return false
    Else
        Loop For i = 0 and i < strlen(str) and i++
            If NOT ((str[i] >= '0' && str[i] < ('0' + base)) ||
                    (str[i] >= 'A' && str[i] < ('A' + base - 10))) then,
                Return false
        Return true
Step 2 -> 関数 int main()
        Set str[] = {"AF87"}
        If isInGivenBase(str, 16) then,
            Print "yes"
        Else
            Print "No"
Stop

C言語での実装例

#include <ctype.h>
#include <stdio.h>
#include <string.h>
bool isInGivenBase(char str[], int base) {
    // 使用できる基数は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' and
            str[i] < ('0' + base)))
            return false;
    }
    // 基数が11以上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を渡すと、すべての文字(A、F、8、7)が16進数で有効な文字であるため「yes」が出力されます。逆に、基数2に対して「1610」のような文字列を渡した場合は「6」や「1」が2進数で使用できない文字であるため「No」が出力されます。このように、文字列の各文字を順番に検証するだけで、数値が指定された基数に属するかどうかを効率的に判定できます。

  1. Pythonでナルシスト数(アームストロング数)を判定するプログラムの作成方法

    ナルシスト数とは? ナルシスト数(Narcissistic Number、別名:アームストロング数)とは、「各桁の数字を桁数乗して合計した値が、元の数そのものと一致する数」のことです。 例えば、9474 を考えてみましょう。この数は4桁なので、各桁の数字を4乗して足し合わせます。 9^4 + 4^4 + 7^4 + 4^4 = 6561 + 256 + 2401 + 256 = 9474 計算結果が元の数 9474 と一致しているため、9474 はナルシスト数であると言えます。 判定アルゴリズムの手順 この問題を解くためには、以下の手順に従います。 数値 n を文字列に変換し、各桁の数字を

  2. 【Python入門】数値が素数かどうかを判定するプログラムの書き方

    この記事では、ユーザーが入力した数値(1より大きい整数)が素数かどうかを判定するPythonプログラムを紹介します。サンプルコードと実行結果、処理の流れを丁寧に解説しているので、Python初心者の方でも理解しやすい内容になっています。素数とは?素数とは、1より大きい正の整数のうち、約数が1とその数自身の2つしか存在しない数のことです。たとえば、2・3・5・7・11などは約数が1と自分自身だけであるため素数です。一方、4や6のように1と自分自身以外の約数を持つ数は「合成数」と呼ばれます。素数判定プログラムのサンプルコード# 入力された数値が素数かどうかを判定するPythonプログラム # ユ