#include<stdio.h>
int main()
{
int m,n,q;
printf("分子 m=");
scanf("%d",&m);
printf("分母 n=");
scanf("%d",&n);
printf("%d%d = ",m,n);
while(){
q =
printf("1/%d + ",q);
m =
}
printf("1/%d\n",n/m);
return 0;
}
古代エジプトでは,例えば 2/5 = 1/3 + 1/15 のように,分数
を分子が1の分数 (単位分数) の形で表す習慣があったそうです.
紀 元 前 1650 年 頃 書 写 さ れ た リ ン ド ・ パ ピ ル ス に は ,
2/5,2/7,2/9,...2/101 を単位分数の和に直すための表が載って
いました.与えられた分数 m/n(m<n とは限らない)を単位分数の和で表す方法と
して,分子1の分数のうち,できるだけ値の大きいものを m/n から取り去ることを
繰り返すアルゴリズムを考えます
・・・よく分かりません・・・
while(_____________){
q =_________________
printf("1/%d + ",q);
m =__________________
_______________________
ここの部分が何を入れればよいのかわからないのです。。。
あと、こんなものもありまして・・・
与えられた分数 m/n を単位分数の和で表す方法は他にもあります.そこで,
入力x を与えて,”x 個の項の単位分数の和で”と条件が加わった場合のプログラム
を書きなさい.たとえば,3/5=1/2+1/10 ですが,x=3 という条件が与えられた場
合, 3/5=1/4+1/4+1/10,3/5=1/2+1/20+1/20 の2 パターンが表示されます.
この問題を教えてください・・・
Re:この問題を教えてください・・・
この掲示板は丸投げはNGなのですが、
せめて問題の意味は分かってますか?
プログラムはさておき、問題で例示されていない、
和の例をいくつかあげられますか?
せめて問題の意味は分かってますか?
プログラムはさておき、問題で例示されていない、
和の例をいくつかあげられますか?
Re:この問題を教えてください・・・
久しぶりに面白そうなのが(笑)
http://www.geocities.jp/ikuro_kotaro/koramu/806_ef.htm
↑より
【1】エジプト分数
どんな分数でも相異なる単位分数の和として表現できることは,簡単に証明できます.それでは
(1)分数p/qを越えない最大の単位分数を求め,p/qから差し引き,それをp1/q1とする
(2)分数p1/q1を越えない最大の単位分数を求め,p1/q1から差し引き,それをp2/q2とする
(3)分数pi/qiを越えない最大の単位分数を求め,pi/qiから差し引き,それをpi+1/qi+1とする
という手順を繰り返せば,つねに単位分数表示が得られるでしょうか?
答えはyesで,このアルゴリズムは破綻しないことが知られています.もちろん,その表示の仕方はただ1通りです.
らしいです。
これの(1)道理に計算すると
まず最大の単位分数…1/2を判定元の数より大きければ1/3を判定という感じですかね?
例題に出していらっる2/5を使うと
2*2 < 1*5
のため1/2のほうが大きいことがわかります。
分母を大きくして1/3を判定
2*3 > 1*5
で2/5のほうが大きいことがわかります。
これを描写。
という感じに繰り返したのがこれです。
#include<stdio.h>
int main(){
int m,n,q;
printf("分子 m=");
scanf("%d",&m);
printf("分母 n=");
scanf("%d",&n);
//通分
if(n<m){
for(q=2;q<=n;q++){
if(n%q==0 && m%q==0){
n/=q;
m/=q;
}
}
}
else{
for(q=2;q<=m;q++){
if(n%q==0 && m%q==0){
n/=q;
m/=q;
q=1;
}
}
}
printf("%d/%d = ",m,n);
while(0<m){
q = 2;
for(;m*q < n;q++);
printf("1/%d + ",q);
n*=q;
m--;
}
return 0;
}
ちょっと書き方変えたので参考までに…
(例題はとけましたが、後はわからないです)
最後に+つくのはミスですが…後で直します。
===
この式はちょっと不適切だったかもしれません。
分子の数だけの足し算を行いますが、
少しおおきなかずを入れると分母がint型の許容範囲を軽く超えます。
例えば
5/20=1/4+1/20+1/534+1/427200+1/2+
と、最後は計算できなくなってます。
というよりも1/4の時点で同じ数なのに…
なので少しバグってます。
====
通分追加しました。
すでに元の原型が崩れかけてます…
エジプト分数って答えが一通りしかないわけではないみたいなので
このプログラムも答えの一つかもしれませんし、
間違っているかもしれません。
スレ主さんは元の式を穴埋めみたいな感じの問題で
出されたのでしょうか?
====
分母<分子
の条件忘れてた…
http://www.geocities.jp/ikuro_kotaro/koramu/806_ef.htm
↑より
【1】エジプト分数
どんな分数でも相異なる単位分数の和として表現できることは,簡単に証明できます.それでは
(1)分数p/qを越えない最大の単位分数を求め,p/qから差し引き,それをp1/q1とする
(2)分数p1/q1を越えない最大の単位分数を求め,p1/q1から差し引き,それをp2/q2とする
(3)分数pi/qiを越えない最大の単位分数を求め,pi/qiから差し引き,それをpi+1/qi+1とする
という手順を繰り返せば,つねに単位分数表示が得られるでしょうか?
答えはyesで,このアルゴリズムは破綻しないことが知られています.もちろん,その表示の仕方はただ1通りです.
らしいです。
これの(1)道理に計算すると
まず最大の単位分数…1/2を判定元の数より大きければ1/3を判定という感じですかね?
例題に出していらっる2/5を使うと
2*2 < 1*5
のため1/2のほうが大きいことがわかります。
分母を大きくして1/3を判定
2*3 > 1*5
で2/5のほうが大きいことがわかります。
これを描写。
という感じに繰り返したのがこれです。
#include<stdio.h>
int main(){
int m,n,q;
printf("分子 m=");
scanf("%d",&m);
printf("分母 n=");
scanf("%d",&n);
//通分
if(n<m){
for(q=2;q<=n;q++){
if(n%q==0 && m%q==0){
n/=q;
m/=q;
}
}
}
else{
for(q=2;q<=m;q++){
if(n%q==0 && m%q==0){
n/=q;
m/=q;
q=1;
}
}
}
printf("%d/%d = ",m,n);
while(0<m){
q = 2;
for(;m*q < n;q++);
printf("1/%d + ",q);
n*=q;
m--;
}
return 0;
}
ちょっと書き方変えたので参考までに…
(例題はとけましたが、後はわからないです)
最後に+つくのはミスですが…後で直します。
===
この式はちょっと不適切だったかもしれません。
分子の数だけの足し算を行いますが、
少しおおきなかずを入れると分母がint型の許容範囲を軽く超えます。
例えば
5/20=1/4+1/20+1/534+1/427200+1/2+
と、最後は計算できなくなってます。
というよりも1/4の時点で同じ数なのに…
なので少しバグってます。
====
通分追加しました。
すでに元の原型が崩れかけてます…
エジプト分数って答えが一通りしかないわけではないみたいなので
このプログラムも答えの一つかもしれませんし、
間違っているかもしれません。
スレ主さんは元の式を穴埋めみたいな感じの問題で
出されたのでしょうか?
====
分母<分子
の条件忘れてた…

Re:この問題を教えてください・・・
似てる…
http://detail.chiebukuro.yahoo.co.jp/qa ... 1049816080
少し日はたってますが、あまりにも書き方まで同じだったので。
もしかしたらですが、利用規約は読みましたか?
同じ質問するときは張りつけたほうがいいとかいてたとおもいます。
QAZさんでなかった場合
ごめんなさい。

http://detail.chiebukuro.yahoo.co.jp/qa ... 1049816080
少し日はたってますが、あまりにも書き方まで同じだったので。
もしかしたらですが、利用規約は読みましたか?
同じ質問するときは張りつけたほうがいいとかいてたとおもいます。
QAZさんでなかった場合
ごめんなさい。
