100から999の間で各桁の積と和が等しい数値を表示し合計数をカウントする方法

100〜999の範囲にある3桁の数字のうち、各桁(一の位、十の位、百の位)の乗算結果が各桁の加算結果と一致する数値とその総数を出力する処理について説明します。

アルゴリズムの実装手順

1. 全ての3桁の数値を走査するループを構築します。

for (int num = 100; num < 1000; num++)

2. 各桁の値を抽出する必要があります。

例として数値472を考えます
472 / 1 == 472
472 / 1 % 10 == 2

472 / 10 == 47
472 / 10 % 10 == 7

472 / 100 == 4
472 / 100 % 10 == 4

a) 直接各桁を取得する方法

  • ones = num / 1 % 10 // 一の位
  • tens = num / 10 % 10 // 十の位
  • hundreds = num / 100 % 10 // 百の位

b) ループを使用する方法

  • for (int divisor = 1; divisor <= num; divisor *= 10)
  • num / divisor % 10 // 最初は一の位、次に十の位、最後に百の位を取得

3. 次に乗算と加算を計算します。

i) 直接取得方式の場合:

ones * tens * hundreds
ones + tens + hundreds

ii) ループ方式の場合:
product *= num / divisor % 10
total += num / divisor % 10

4. 条件比較を行い、該当する数値を表示します。

if (total == product) 表示処理

実装コード

以下のコードは直接各桁を抽出する方法です。

#include <stdio.h>

int main(void)
{
    int counter = 0;

    int number;
    for (number = 100; number < 1000; number++)
    {
        int unit_digit = number / 1 % 10;
        int ten_digit = number / 10 % 10;
        int hundred_digit = number / 100 % 10;

        if (unit_digit * ten_digit * hundred_digit == unit_digit + ten_digit + hundred_digit)
        {
            printf("%d\n", number);
            counter++;
        }
    }
    printf("合計%d個\n", counter);

    return 0;
}

以下は入れ子ループを使用した実装です。

#include <stdio.h>

int main(void)
{
    int counter = 0;

    int number, position;
    for (number = 100; number < 1000; number++)
    {
        int sum_value = 0;
        int product_value = 1;
        for (position = 1; position <= number; position *= 10)
        {
            sum_value += number / position % 10;
            product_value *= number / position % 10;
        }
        
        if (sum_value == product_value)
        {
            printf("%d\n", number);
            counter++;
        }
    }
    printf("合計%d個\n", counter);

    return 0;
}

応用編:100〜99999の範囲での処理

#include <stdio.h>

int main(void)
{
    int counter = 0;

    int number, position;
    for (number = 100; number < 100000; number++)
    {
        int sum_value = 0;
        int product_value = 1;
        for (position = 1; position <= number; position *= 10)
        {
            sum_value += number / position % 10;
            product_value *= number / position % 10;
        }
        
        if (sum_value == product_value)
        {
            printf("%d\n", number);
            counter++;
        }
    }
    printf("合計%d個\n", counter);

    return 0;
}

タグ: c-language Algorithm mathematics loops digit-extraction

9月9日 09:06 投稿