蓝桥杯 历年真题 2014年B组第6题 奇怪的分式 两种解法噢!

本文介绍了蓝桥杯竞赛中一题关于奇怪的分式的解法。题目要求避免分子分母相同的情况,并正确处理分数的约分。解题思路包括使用四重循环,注意分子分母不能相同,以及通过最大公约数进行约分。文章提供了两种解决方案,一种是通过编写约分函数,另一种则是直接利用等式性质求解,无需额外函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

标题:奇怪的分式

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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值