codeforces B. Routine Problem 解题报告

题目链接:http://codeforces.com/problemset/problem/337/B

     看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影)。接着让我很意外的是,在纸上比划了一下,凭着直觉,竟然一次AC,那个兴奋啊 !^_^ !  好啦,不说废话。

     这个题目被分类为 math 和 matrices ,数学还好理解,matrices,应该是母函数吧(不好意思的说,还没系统地学到),姑且让我分类到数学里吧。题目的意思是,给出一个水平长度 : 垂直长度的比例分别为 a:b 的 monitor 屏幕和 c:d 的 movie 框架,要求算出 movie 框架嵌入monitor屏幕后空出的部分,要求用最简分数表示。

     从 Sample 可以看出,a/b 和 c/d 有三种关系:a/b  > c/d, a/b < c/d, a/b = c/d(当然,可以把 a/b = c/d 这种情况纳入 > 或者 < 当中,此时就只有两种关系了)。

     我的做法就是先判断给出的 a/b 和 c/d 究竟属于哪种关系,然后小的那个分数就除以大的那个分数,结果可能不会是最简分数,然后分子分母同时除以最大公约数,最后用 1 减去化简后的分数即是结果。

    

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 using namespace std;
 5 
 6 int gcd(int x, int y)
 7 {
 8     while (x != y)
 9     {
10         if (x > y)
11             x = x - y;
12         else
13             y = y - x;
14     }
15     return x;
16 }
17 
18 int main()
19 {
20     int a, b, c, d, k, t3, t4;
21     double t1, t2;
22     while (scanf("%d%d%d%d", &a, &b, &c, &d) != EOF)
23     {
24         t1 = (double)a /(double)b;   // 强制类型转换成浮点数,方便比较 a/b和 c/d 的大小
25         t2 = (double)c /(double)d;
26     //  cout << "t1 = " << t1 << endl;
27     //  cout << "t2 = " << t2 << endl;
28         if (t1 > t2)     // a/b > c/d,则得出的结果是(b*c) / (a*d) 
29         {
30             t3 = b * c;    // t3保存分子
31             t4 = a * d;    // t4保存分母
32         }
33         else
34         {
35             t3 = a * d;
36             t4 = b * c;
37         }
38         k = gcd(t3, t4);
39         t3 = t3 / k;     // 得到约去最大公约数的分子
40         t4 = t4 / k;     // 得到约去最大公约数的分母
41         cout << t4 - t3 << "/" << t4 << endl;   // 实质上是1 - t3/t4,由于t3、t4在上一步中已经为最简,因此 (t4-t3) / t4 不需要再判断是否为最简分数
42         }
43     return 0;
44 }
原文地址:https://www.cnblogs.com/windysai/p/3264158.html