题目
标题:奇怪的分式
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
1/4 乘以 8/5
小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
请写出所有不同算式的个数(包括题中举例的)。
显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数int之列!
注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。
题解与思路
简单粗暴地暴力题,写这篇只是想提醒自己留一个心眼,不能把问题思考的过于片面、简单。
首先整体就是四重循环了,然后按照题意分子分母是不能相同的,所以这有一个细节:a不等于b,c不能等于d。再然后我们需要知道,本题中的if条件,它并不是
a*c/(c*d)==(a*10+c)/(b*10+d)
这样是判断不出的,为什么呢?因为你要比较的应该是一个约分后的结果,如果不考虑约分,在C语言中用除号是会产生不一样的结果的。所以我们这里似乎就需要设置一个约分函数,约分函数很简单就是找出分子分母的最大公约数再相除:
代码如下
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
int sum=0;
for(int a=1;a<=9;a++){
for(int b=1;b<=9;b++){
for(int c=1;c<=9;c++){
for(int d=1;d<=9;d++){
int g1=gcd(a*c,b*d);
int g2=gcd(a*10+c,b*10+d);
if(a!=b&&c!=d&&(a*c/g1==(a*10+c)/g2&&b*d/g1==(b*10+d)/g2)){
sum++;
}
}
}
}
}
cout<<sum;
return 0;
}
当然了这里再给出另一种解法,其实更加的接地气,不需要设置新函数,那就是直接利用等式的性质,一看便懂,代码如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
int sum=0;
for(int a=1;a<=9;a++){
for(int b=1;b<=9;b++){
for(int c=1;c<=9;c++){
for(int d=1;d<=9;d++){
if(a!=b&&c!=d&&((a*c)*(b*10+d)==b*d*(a*10+c))){
sum++;
}
}
}
}
}
cout<<sum;
return 0;
}