蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

蓝桥杯 枚举 奇怪的分式

标题:奇怪的分式

 

    上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

 

    1/4 乘以 8/5

 

    小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

 

    老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

 

    对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

 

    请写出所有不同算式的个数(包括题中举例的)。

 

    显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

 

    但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

 

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

挺简单的,要是暴力枚举也没问题,用一个DFS的深搜代码看上去简单点,另外熟悉GCD,将两个分数的最大公约数求出,相除公约数,再去判断这两个分数是否相同。

答案:14

代码如下

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #define MAXN 5
 4 using namespace std;
 5 int num[MAXN],s1,s2,r1,r2;
 6 int count=0;
 7 int gcd(int a,int b)
 8 {
 9     int s;
10     while(b)
11     {
12         s=a%b;
13         a=b;
14         b=s;
15     }
16     return a;
17  } 
18 void dfs(int m)
19 {
20     int i,j,a,b,t,ss1,ss2,rr1,rr2;
21     if(m==5)
22     {
23         if(num[1]!=num[2]&&num[3]!=num[4])
24         {
25             s1=num[1]*10+num[3];
26             s2=num[2]*10+num[4];
27             r1=num[1]*num[3];
28             r2=num[2]*num[4];
29             if(r1<r2)
30             {
31                 a=r2;
32                 b=r1;
33                 t=gcd(a,b);
34             }
35             else
36             {
37                 a=r1;
38                 b=r2;
39                 t=gcd(a,b); 
40             }
41             rr1=r1/t;
42             rr2=r2/t;
43             if(s1<s2)
44             {
45                 a=s2;
46                 b=s1;
47                 t=gcd(a,b);
48             }
49             else
50             {
51                 a=s1;
52                 b=s2;
53                 t=gcd(a,b); 
54             }    
55             ss1=s1/t;
56             ss2=s2/t;
57             if(rr1==ss1&&rr2==ss2)
58             {
59                 cout<<num[1]<<"/"<<num[2]<<" * "<<num[3]<<"/"<<num[4]<<" = "<<num[1]<<num[3]<<"/"<<num[2]<<num[4]<<endl;
60                 count++;
61             }
62         }
63     }
64     else
65     {
66         for(i=1;i<=9;i++)
67         {
68             num[m]=i;
69             dfs(m+1);
70         }
71     }
72  } 
73  int main()
74  {
75      dfs(1);
76      cout<<count<<endl;
77      return 0;
78  }

 

posted @ 2015-03-31 00:03  fancy_boy  阅读(677)  评论(0编辑  收藏  举报