1. 程式人生 > >PAT乙級 1062 最簡分數 (20 分)

PAT乙級 1062 最簡分數 (20 分)

一個分數一般寫成兩個整數相除的形式: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

程式碼:

#include<stdio.h>
int GCD(int a,int b){
	int c=a%b;
	while(c){
		a=b;
		b=c;
		c=a%b;
	}
	return b;
} 
int main(){
	int N[2],M[2],K,sign=1;
	scanf("%d/%d %d/%d %d",&N[0],&M[0],&N[1],&M[1],&K);
	if(N[0]*M[1]>N[1]*M[0]){
		int temp_N=N[0],temp_M=M[0];
		N[0]=N[1],M[0]=M[1];
		N[1]=temp_N,M[1]=temp_M;
	}
	for(int i=0;i<K;++i){
		if(GCD(K,i+1)==1){
			if(((i+1)*M[0]>N[0]*K)&&((i+1)*M[1]<N[1]*K)){
				if(sign){
					sign=0;
					printf("%d/%d",i+1,K);
				}
				else{
					printf(" %d/%d",i+1,K);
				}
			}
		}
	}
	return 0;
}

在這裡插入圖片描述