dポイントプレゼントキャンペーン実施中!

初歩的で申し訳ないのですが、10進数を2進数に変換して表示する関数dt(n)を再帰的に定義するプログラムを作ってみたのですがつまってしまいました。以下、考えたコード文です。

#include <stdio.h>
/*****dt*******/
long dt(int n) {
     if(n == 1)
         printf("1");
     else
         dt(n % 2);
         printf("%d" , n);
}

/****** Main ******/
void main(void) {
     dt(10);
}

どこが間違えているかご指摘頂けたら有難いです。

A 回答 (2件)

このプログラムには間違いがいくつかあります。


間違い1
 dtはlong型の値を返すとなっているが、return文がない。
<対策>
 dtは戻り値を返す必要はないので、voidで宣言する
 long dt(int n) → void dt(int n)

間違い2
 if文のelse節に複数文を書くときは{}でくくる。
{}を省略すると1文のみ有効になる
 これはthen節(条件が成立したときに実行する部分)も同じだが、今回then節には1文しかないので省略可能(でも私的には省略したくありません)
 <対策>
  else節を{}でくくる
  if(n == 1)
         printf("1");
     else
         dt(n % 2);
         printf("%d" , n);

  if(n == 1)
         printf("1");
     else{
         dt(n % 2);
         printf("%d" , n);
}
間違い3
 出力するのは2で割った余り(筆算で10進数を2進数に変換するときは余りを使いますよね)
 従って
  printf("%d" , n); →printf("%d" , n%2);

間違い4
 再帰呼び出し時に渡すものは2で割った答え(筆算で10進数を2進数に変換するときは答えを2で割っていくことを繰り返しますよね)
 従って
  dt(n % 2); → dt(n / 2);


以上を修正すれば上手くいくと思います。



 
    • good
    • 0

>どこが間違えているかご指摘頂けたら有難いです。


「n % 2」で求められる解(余り)は「0」か「1」
10(10)=1010(2)なら、
 「n=10」なのでelseを実行→「n%2」で「0」を渡す→elseを実行(以下略)の無限ループ
11(10)=1011(2)なら、
 「n=11」なのでelseを実行→「n%2」で「1」を渡す→ifを実行して終了
となる。
「2で割った余り」ではなく「2で割った商」を0になるまで与えていく。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!