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

【C言語】合計がNになるように、0と1のみで構成される数を出力するプログラム

問題概要

整数 n が与えられたとき、0と1のみで構成される数を組み合わせて、その合計がちょうど n になるような組み合わせを出力するのが課題です。

0と1だけで表現できる数には「1」「10」「11」などがあります。これらの数を足し合わせて合計が n と等しくなるように、該当する数を順番に出力します。

たとえば n = 31 を入力した場合、「10 + 10 + 11」または「10 + 10 + 10 + 1」といった組み合わせが答えになります。

入力例と出力例

Input: 31
Output: 10 10 10 1

アルゴリズム

残りの値に応じて「10」「11」「1」を選びながら合計を組み立てていくシンプルな手法です。

int findNumbers(int n)
START
STEP 1: 変数 m = n % 10、a = n を宣言して代入する
STEP 2: a > 0 の間、以下の処理を繰り返す
   IF a/10 > 0 かつ a > 20 ならば、
     a から 10 を引いた値を a に代入し直す
     "10 " を出力する
   ELSE IF a - 11 == 0 ならば、
     a から 11 を引いた値を a に代入し直す
     "11 " を出力する
   ELSE
     "1 " を出力する
     a を 1 減らす
   END IF
END LOOP
STOP

処理のポイント

残りの値 a が 21 以上あるうちは、できるだけ大きな「10」を使って合計に近づけます。残りがちょうど 11 になった時点で「11」を一度に出力することで、出力する個数を抑えられます。それ以外の場合は「1」を一つずつ加算していきます。

C言語での実装例

#include <stdio.h>
// 数を出力する関数
int findNumbers(int n) {
   int m = n % 10, a = n;
   while (a > 0) {
      if (a / 10 > 0 && a > 20) {
         a = a - 10;
         printf("10 ");
      }
      else if (a - 11 == 0) {
         a = a - 11;
         printf("11 ");
      }
      else {
         printf("1 ");
         a--;
      }
   }
}
// ドライバーコード
int main() {
   int N = 35;
   findNumbers(N);
   return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

10 10 1 1 1 1 11

N = 35 の場合、「10 + 10 + 1 + 1 + 1 + 1 + 11 = 35」となり、すべて 0 と 1 だけで構成された数の合計が N と一致していることが確認できます。

  1. C言語で文字列へのポインタの配列とそのアドレスを出力する方法

    まずは、C言語における「ポインタの配列」とは何かを確認しましょう。 文字列へのポインタの配列とは 各要素が、文字列の先頭アドレスを指すポインタになっている配列のことです。 宣言と初期化は次のように行います。 char *a[ ] = {"one", "two", "three"}; ここで、a[0] は文字列 one の、a[1] は two の、a[2] は three のそれぞれ先頭アドレスを指すポインタです。 イメージとしては、配列の各要素が対応する文字列の先頭番地を保持しており、その番地をたどることで文字列本体へアクセスで

  2. Cプログラムで2次元行列の四隅の要素とその合計を出力する方法

    概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算