
初歩的で申し訳ないのですが、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件)
- 最新から表示
- 回答順に表示
No.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);
以上を修正すれば上手くいくと思います。
No.1
- 回答日時:
>どこが間違えているかご指摘頂けたら有難いです。
「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になるまで与えていく。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cshの文字列操作(0埋め)
-
コンパイルエラーについて
-
入力したお金の金額からお札の...
-
scanfに文字が入力されたときに...
-
なぜgccはstdio.hをインクルー...
-
10個出力で改行したいのですが...
-
C言語 素数判定
-
文字と数字の判定について
-
WM_CLOSEで閉じれないウィンド...
-
defineで定数が置き換えられな...
-
LU分解法のピボット選択機能実...
-
*を使ったジグザグのラインをプ...
-
error C2143: 構文エラー : ';'...
-
wsprintfの書式制御文字列につ...
-
printfの有無で値が変化する
-
【C言語教えてください】sin波...
-
並べ替えについて
-
コマンドラインに出力した文字...
-
4の倍数を論理演算で表す。。
-
三角形の判別
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報