蓝桥杯 枚举 奇怪的分式
标题:奇怪的分式
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
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 }