演算法學習之路|最簡分數

kissjz發表於2018-02-28

一個分數一般寫成兩個整數相除的形式:N/M,其中M不為0。最簡分數是指分子和分母沒有公約數的分數表示形式。

現給定兩個不相等的正分數 N1/M1 和 N2/M2,要求你按從小到大的順序列出它們之間分母為K的最簡分數。

輸入格式

輸入在一行中按N/M的格式給出兩個正分數,隨後是一個正整數分母K,其間以空格分隔。題目保證給出的所有整數都不超過1000。

輸出格式

在一行中按N/M的格式列出兩個給定分數之間分母為K的所有最簡分數,按從小到大的順序,其間以1個空格分隔。行首尾不得有多餘空格。題目保證至少有1個輸出。

輸入樣例:
7/18 13/20 12
輸出樣例:
5/12 7/12

我的思路

分子分母找出最大公因數。

然後各自/=最大公因數,重複上述,

直到最大公因數為1即可。

詳情見程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
    int a;
    int b;
};
int fun(int a,int b){
    a=max(a,b);
    b=min(a,b);
    int r=1;
    while(r!=0){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main(){
    double low,high;
    int a,b;
    scanf("%d/%d",&a,&b);
    low=a*1.0/b;
    scanf("%d/%d",&a,&b);
    high=a*1.0/b;
    high=max(low,high);
    low=min(low,high);
    int k;
    cin>>k;
    vector<struct node> v;
    for(int i=1;i<k;i++){
        if(fun(k, i)!=1)
            continue;
        if(i*1.0/k<=high&&i*1.0/k>=low){
            struct node tmp;
            tmp.a=i;
            tmp.b=k;
            v.push_back(tmp);
        }
    }
    for(int i=0;i<v.size()-1;i++){
        cout<<v[i].a<<"/"<<v[i].b<<" ";
    }
    cout<<v[v.size()-1].a<<"/"<<v[v.size()-1].b;
}


相關文章