![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
初歩的で申し訳ないのですが、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でAからZまでを表示する...
-
hit&bolwのプログラミングがで...
-
【C言語教えてください】sin波...
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
error C2143: 構文エラー : ';'...
-
C言語に関する質問です
-
C言語 プログラミング
-
if文がコンパイルエラーを起こ...
-
C言語で入力した変数の値から三...
-
wsprintfの書式制御文字列につ...
-
ホームページをC言語で作りたい...
-
strcmp
-
分数を表示するプログラム(長...
-
4の倍数を論理演算で表す。。
-
英語小文字または大文字を入力...
-
unsigned int型について
-
コマンドラインに出力した文字...
-
C言語のヘッダーファイルの作成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報