PAT B1062

来源:互联网 发布:淘宝消字灵是真的么 编辑:程序博客网 时间:2024/06/07 04:06

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 <cstdio>#include <cmath>using namespace std;struct Fraction{  int up, down;}f1, f2, temp, jll[1010];int gcd(int a, int b){  return !b ? a : gcd(b, a % b); }Fraction reduction(Fraction result){  if(result.down < 0){    result.up = -result.up;    result.down = -result.down;  }  if(result.up == 0){    result.down = 1;  } else {    int d = gcd(abs(result.up), abs(result.down));    result.up /= d;    result.down /= d;  }  return result;} Fraction minu(Fraction f1, Fraction f2){  Fraction result;  result.up = f1.up * f2.down - f2.up * f1.down;  result.down = f1.down * f2.down;  return result;}void showResult(Fraction r){  r = reduction(r);  if(r.down == 1) printf("%d/%d", r.up, r.down);  else {    printf("%d/%d", r.up, r.down);  }}bool pd(Fraction a, Fraction b){  Fraction r;  r = minu(a, b);  r = reduction(r);  if(r.up <= 0){    return false;  } else {    return true;  }}int main(){  int k;  scanf("%d/%d", &f1.up, &f1.down);  scanf("%d/%d", &f2.up, &f2.down);  scanf("%d", &k);  int jl = 0;  temp.up = 1;  temp.down = k;  bool _pd1 = pd(temp, f1);               //前面大于后面的返回true   否则返回false   bool _pd2 = pd(f2, temp);  if(_pd1 == true && _pd2 == true){    jll[jl++] = temp;  }    for(int i = 2; i <= k; i++){    if(gcd(k, i) == 1){      temp.up = i;      temp.down = k;      bool _pd1 = pd(temp, f1);               //前面大于后面的返回true   否则返回false       bool _pd2 = pd(f2, temp);      if(_pd1 == true && _pd2 == true){        jll[jl++] = temp;      }    }  }  for(int i = 0; i < jl; i++){    showResult(jll[i]);    if(i != jl - 1){      printf(" ");    }  }  printf("\n");  return 0;} 




0 0
原创粉丝点击