質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

877閲覧

1/nの少数表示のプログラムについて

za-to

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/02 03:03

1/nの少数表示を書き出すプログラムについてです。 **で囲まれている部分の意味がある程度しか理解できません。 ➀i=1から始まり、r!=0(余りが0でない)&& k==0ならiをプラスするという部分の、なぜkは0なのか、ここにkが必要なのか ➁rr[k]!=r;とはどういう意味なのか、その後のk--という部分が分かりません。 コードの一部が考えてもいまいち理解できず、困っています。 どなたか教えていただけますでしょうか。よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]){ int n; int r,q,i,j,k; int *rr, *qq; scanf("%d",&n); rr= calloc(n,sizeof(int)); qq= calloc(n,sizeof(int)); ** r= 1; k= 0; ➀for(i= 1; r!=0 && k==0; i++){ rr[i]= r; r*= 10; q= r/n; qq[i]= q; r= r%n; ➁for(k= i; k!=0 && rr[k]!=r; k--); ** } printf("0."); for(j=1; j!=i; j++){ if(r!=0 && j==k) printf("'"); printf("%d", qq[j]); } printf("\n"); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

大体わかりました。各変数の役割はざっとこんなもの。

  • n は割る数…は言うまでもないかw
  • r が0になったら割り切れたことを意味する
  • qq[?] 求める結果の各桁、一桁分(それぞれの値は0~9)。
  • rr[?] 筆算で割り算をした際、各段の余り(それぞれの値は0~n-1)。
  • k が0でない時、循環小数の繰り返しが始まる桁を示す

➁rr[k]!=r;とはどういう意味なのか、その後のk--という部分が分かりません

まずこちらから。循環小数が始まったことがわかるのは、割り算を進めていって、桁数を増やして行った所で

  • 前に出てきた余り(rr[?])と
  • 今出た余り(r = r % n)

が一致した時です。その一致を検出しようとするのが②のループです。

C

1 for(k= i; k!=0 && rr[k]!=r; k--);

k の値はここまで進んだ桁数 i から0に向かって減らしていく、つまり小数点に向かって戻りつつ、以前の余り(rr[?])が今出た余り(r)と一致するかどうかを検査します。 k が0になるまえに  rr[k] == r となれば循環小数になったということ。

例えば 1÷3 の結果は 0.'3 つまり 0.333333... です。小数点第一位の3を求めた時点で余り1が出ます。この1は最初に割ろうとした1と同じ値ですから、循環が始まったことがわかります。同様に6で割る場合、7で割る場合など、手間を惜しまず筆算してみてください。

➀i=1から始まり、r!=0(余りが0でない)&& k==0ならiをプラスするという部分の、なぜkは0なのか、ここにkが必要なのか

k != 0 なら循環小数が始まっていた事を意味するので、計算は終了してよい。①のループを終了するために k を検査しながらループを回しています。

コードの一部が考えてもいまいち理解できず

考えても分からない場合、各変数がどう変化するか値をトレースしてみる手があります。変数の値の変化を見ると役割を推測できます。私も計算途中の変数を表示させて確認しました。
もう一つ、この問題なら実際に筆算してみること。具体的なデータを使って考えることは、プログラムを作る場合も大事です。

投稿2021/07/02 06:39

rubato6809

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

za-to

2021/07/03 09:47

回答ありがとうございます。 実は筆算を行って数字を追っていたのですが、Kの意味が分からなくて困っていました。 おかげさまで、理解することが出来ました。 ありがとうございました。
guest

0

rubato6809さんの説明の補足です。

このコードは全体として筆算を使った割り算とほぼ同じことをやっています。

小学4年生の算数 小数点の割り算の 筆算問題の やり方と答えがわかりません。 やり方と答えを 教えての回答No.5の書き方で説明します。

今回のように1/nの場合は1より小さいので小数点よりも前は考える必要がありません。

rrに入るのは
10, 100,1000,・・・
ですが、それぞれ答えの小数点以下一桁であること、小数点以下二桁であること、小数点以下三桁であること、を示しています。

qqに入るのは、それぞれ答えの小数点以下一桁の数字、小数点以下二桁、小数点以下三桁の数字です。
92.2÷40の筆算でいうと、2.305の3と0と5に相当します。

qqに入るqを求める方法は筆算とは少し違います。
92.2÷40の筆算での小数点以下二桁の数字を求める場合20%40が0という計算をしていますが、プログラムでは(92.2*100)%40にあたるものを計算していますが、

(92.2100)%40 = 9220%40 - 0 = 9220%40 - (2.3100)*40%40 = (9220 - 9200)%40 = 20%40

ですので同じことをやっているのです。

投稿2021/07/03 00:39

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

za-to

2021/07/03 09:53

回答に別の例を加えての説明ありがとうございます。 より納得できました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問