記事のディレクトリ
1.トピック
分数は通常、2つの整数を除算する形式で記述されます。N/ M、ここでMはゼロではありません。最も単純な分数とは、分子と分母に共通の除数がない分数表現を指します。
ここで、2つの等しくない正の分数N 1 / M 1 N 1 / M1が与えられますN .1 / M .1およびN2 / M 2 N 2 /N 2 / M 2、その間に記載されている昇順で質問してください。分母はK分数です。
入力形式:
1行にN / Mの形式で2つの正の分数を入力し、その後にスペースで区切って正の整数分母Kを入力します。質問は、与えられたすべての整数が1000を超えないことを保証します。
出力フォーマット:
指定された2つの分数の間に分母Kがある最も単純な分数をすべて、スペースで区切って昇順でN / Mの形式で1行にリストします。行の最初と最後に余分なスペースがあってはなりません。質問には少なくとも1つの出力があることが保証されています。
入力サンプル:
7/18 13/20 12
出力サンプル:
5/12 7/12
2.アイデアと注意事項
アイデア:
(1)クロス乗算比較サイズ
a、b、c、dがすべて正の数の場合、ab> cdの場合、ad> bc a、b、c、dがすべて正の数の場合、\ frac ab> \ frac cdの場合、ad> bc 若a,b 、c 、Dの平均は、ある正の数、場合bA>>dC、次にa d>>b c
(2)小数に変換した後のスコアを比較します。
ただし、次のように、いくつかの異なるデータ型の出力結果に注意してください。
(1) 5/(double)12 答案:0.416667
(2) 两个double型变量a,b.其中:a=5,b=12。 a/b 答案:0.416667
(3) double k = 5 / 12 k 答案:0
- 最も単純な正の数に減らしたい場合、つまり、2つの数の最大公約数を見つけます。定義された方法は、投げて分割する方法です。
int gcd(int a, int b) //辗转相除法找到最大公约数
{
return b == 0 ? a : gcd(b, a % b);
}
説明:関数の戻り値が1の場合、2つの数値の最大公約数が1であることを意味します。これは、最も単純な分数です。最も単純なスコアの場合は、出力します。
- 定義行の最初と最後に余分なスペースを入れることはできません。方法:define flag、初期値はfalse。最初の最も単純なスコアが検出された
場合、フラグはfalseのままで、出力形式はprintf( "% d /%d "、i、k);
lfagを真にします;出力形式は次のとおりです:printf("%d /%d "、i、k);
したがって、最初の最も単純なスコアの後、最後の1つのスペースの前の最も単純なスコア
3、ACコード
#include <iostream>
#include<algorithm>
using namespace std;
int gcd(int a, int b) //辗转相除法找到最大公约数
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
int n1, m1, n2, m2, k;
bool flag = false;
scanf("%d/%d %d/%d %d", &n1,&m1,&n2,&m2,&k);
if (m1 * n2 < n1 * m2)
//输入的时候题目没有说明第一个输入的分数必然大于第二个,通过交叉相乘比较两个分数的大小。
{
swap(n1, n2);
swap(m1, m2);
} //该交换保证了第一个分数一定小于第二个数
for (int i = 1; i < k; i++)
{
if ((n1 * k < i * m1) && (i * m2 < k * n2))
{
if (gcd(i,k) == 1) //表示二者没有最大公约数,也就是最简分数。
{
if (flag == false)
{
printf("%d/%d", i, k);
}
else
{
printf(" %d/%d", i, k);
}
flag = true;
}
}
}
}
結果: