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

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

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

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

Q&A

解決済

2回答

8569閲覧

C言語での分数の計算方法(帯分数表示、約分、整数表示)について

tsuyoku-naritai

総合スコア7

C

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

0グッド

2クリップ

投稿2021/01/27 07:42

編集2021/01/27 08:20

C言語で次のプログラムを作りたいです。
2つの分数同士の足し算をし、その結果を分数で表示するプログラムで、分子、分母共に最大値が10で、最小値は分母が2、分子が1として、それらの数値をランダムに発生させます。計算結果は、分子と分母がきちんと約分されていて、分子が分母の数で割り切れる場合は、整数として表示させます。
例えば
1/2 + 1/3 = 5/6 ふつう
5/6 + 2/3 = 1.1/2 帯分数
3/8 + 1/8 = 1/2 約分
1/2 + 1/2 = 1 整数
全くわかりませんでしたが一応自分でも次のように考えました。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int gcd(int,int); 6 7int main(void){ 8 int m,n,i,j,t; 9 double o,p,s; 10 srand((unsigned)time(NULL)); 11 m = rand() % 9 + 2; 12 n = rand() % 9 + 2; 13 i = rand() % 10 + 1; 14 j = rand() % 10 + 1; 15 o = i / m; 16 p = j / n; 17 if((o+p)>=1){ 18 t = (o+p) / gcd(m,n); 19 s = (o+p) - t; 20 printf("%d/%d + %d/%d =%d.%f\n",i,m,j,n,t,s); 21 }else{ 22 printf("%d/%d + %d/%d = %f\n",i,m,j,n,o+p); 23 } 24 return 0; 25} 26 27int gcd(int m,int n){ 28 if(m%n==0){ 29 return n; 30 }else{ 31 return gcd(n,m%n); 32 } 33}

最近C言語を勉強し始めたものです。
2行目から4行目でかいたプログラムにする方法を教えて欲しいです。
ご回答よろしくお願いします。

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

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

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

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

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

episteme

2021/01/27 08:02

> ご回答よろしくお願いします。 しつもんはなんですか?
kazuma-s

2021/01/27 08:04

#を省略しないでください。コードを「```C」と「```」で挟めばちゃんと表示されます。 ```C #include <stdio.h> ... } ``` と書くということです。 それから、最初は乱数を使わずに 1/2+1/3 = 5/6 ができるようにしてみてください。
tsuyoku-naritai

2021/01/27 08:18

>episteme様 言葉足らずですいません、2行目から4行目に書いてあるプログラムの作り方を知りたいです。 >Kazuma-s様 コードの表示をさせ方を教えていただきありがとうございます。 乱数を使わずにやってみます。
guest

回答2

0

ベストアンサー

gcd は 1回だけ求めればよいでしょう。

C

1#include <stdio.h> 2#include <stdlib.h> // srand, rand 3#include <time.h> 4 5int main(void) 6{ 7 srand(time(NULL)); 8 int n1 = rand() % 10 + 1, d1 = rand() % 9 + 2; // numerator(分子) 9 int n2 = rand() % 10 + 1, d2 = rand() % 9 + 2; // denominator(分母) 10 int n3 = n1 * d2 + n2 * d1, d3 = d1 * d2; 11 int n = n3, d = d3, r; 12 while (r = n % d) { n = d; d = r; } // d = gcd(n3, d3) 13 n3 /= d; 14 d3 /= d; 15 if (d3 == 1) 16 printf("%d/%d + %d/%d = %d\n", n1, d1, n2, d2, n3); 17 else if (n3 < d3) 18 printf("%d/%d + %d/%d = %d/%d\n", n1, d1, n2, d2, n3, d3); 19 else 20 printf("%d/%d + %d/%d = %d+%d/%d\n", n1, d1, n2, d2, n3/d3, n3%d3, d3); 21}

投稿2021/01/27 11:59

kazuma-s

総合スコア8224

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

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

tsuyoku-naritai

2021/01/28 09:07 編集

>kazuma-s 様 回答ありがとうございます。確かに、そちらの方が短くて理解しやすいです。 何回も質問してごめんなさい。whileの最大公約数を求めるところがいまいちまかりません。またif~elseのところで{}は必要ないのでしょうか?お時間ありましたら、教えてください。
kazuma-s

2021/01/29 06:20

n を d で割った余りを r に代入し、それが 0 でなかったら、n = d; d = r; を実行する。 r が 0 になるまで繰り返すと、d に最大公約数が求まります。 if文は「if (式) 文」という構文で、(式) の後に 1個の文しか置けません。 2つ以上の文を書きたいときに { } で括って 1つの文にしているのです。 文が 1つのときは { } は不要です。{ } を使っても構いませんが。
guest

0

おそらく、できたと思うのでのせておきます。間違っているのを見つけたら教えてください。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int gcd(int,int); 6int lcm(int,int); 7 8int main(void){ 9 int m1,n,i1,j,m2,i2,p,q,t,s; 10 srand((unsigned)time(NULL)); 11 n = rand() % 9 + 2; 12 j = rand() % 9 + 2; 13 m1 = rand() % 10 + 1; 14 i1 = rand() % 10 + 1; 15 m2 = m1*(lcm(n,j)/n); 16 i2 = i1*(lcm(n,j)/j); 17 p = m2 + i2; 18 q = lcm(n,j); 19 t = p / q; 20 s = p % q; 21 if(p%q==0){ 22 printf("%d/%d + %d/%d = %d\n",m1,n,i1,j,p/q); 23 }else if((p/q)>=1){ 24 if(gcd(s,q)==1){ 25 printf("%d/%d + %d/%d = %d.%d/%d\n",m1,n,i1,j,t,s,q); 26 }else{ 27 printf("%d/%d + %d/%d = %d.%d/%d\n",m1,n,i1,j,t,s/gcd(s,q),q/gcd(s,q)); 28 } 29 }else if(gcd(p,q)!=1){ 30 printf("%d/%d + %d/%d = %d/%d\n",m1,n,i1,j,p/gcd(p,q),q/gcd(p,q)); 31 }else{ 32 printf("%d/%d + %d/%d = %d/%d\n",m1,n,i1,j,p,q); 33 } 34 return 0; 35} 36 37int gcd(int m,int n){ 38 if(m%n==0){ 39 return n; 40 }else{ 41 return gcd(n,m%n); 42 } 43} 44 45int lcm(int m,int n){ 46 return (m*n)/gcd(m,n); 47}

投稿2021/01/27 10:27

tsuyoku-naritai

総合スコア7

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

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

kazuma-s

2021/01/27 12:01

間違ってはいませんが、gcd の呼び出し回数がとても多いようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問