PAT B:1062の最も単純なスコア(20ポイント)



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. 1人の羊飼いから学ぶ

  2. 2柳の神から学ぶ

  3. 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)小数に変換した後のスコアを比較します。
ただし、次のように、いくつかの異なるデータ型の出力結果に注意してください。

15/(double)12										答案:0.4166672)	两个double型变量a,b.其中:a=5,b=12。		  a/b       答案:0.4166673double k = 5 / 12							k		答案:0
  1. 最も単純な正の数に減らしたい場合、つまり、2つの数の最大公約数を見つけます。定義された方法は、投げて分割する方法です。
int gcd(int a, int b)                           //辗转相除法找到最大公约数
{
    
    
    return b == 0 ? a : gcd(b, a % b);
}

説明:関数の戻り値が1の場合、2つの数値の最大公約数が1であることを意味します。これは、最も単純な分数です。最も単純なスコアの場合は、出力します。

  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;
            }
        }
    }
}


結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/SKMIT/article/details/114177171