C++版浙大PAT乙级1062(20分)测试点1、测试点4答案错误解决方法

https://pintia.cn/problem-sets/994805260223102976/problems/994805268334886912

这题我的想法是,先通分,让7/18,13/20,变成70/180,117/180,因为180可以看作12*15,因此我从71到116中找出是15的倍数的数,比如75/180就可以看坐5*15/12*15,约掉就是5/12,当然了,还是要排除这种情况,比如90/180可以看作6*15/12*15,约掉就是6/12,它们有公约数,不是最简的所以不行。

一开始测试点1错了,我猜出是输入的两个分数是前者大,后者小,需要交换位置。

但是无法通过测试点4,因为如果是这种情况,1/3,2/3,12,分数的最小公倍数是3,不能看作12的倍数,所以求出了两个分母的最小公倍数后,还要再求这个最小公倍数与12的最小公倍数。

#include<iostream>
using namespace std;

int gcd(int a, int b){
    return b == 0 ? a : gcd(b, a % b);
}

int main() {
	int n1, m1, n2, m2, k, m, t, flag = 0;
	scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
	// 两个分数的分母的最小公倍数
	m = m1 * m2 / gcd(m1, m2);
	m = m * k / gcd(m, k);
	// 通分后的分子
	n1 *= m/m1;
	n2 *= m/m2;
	if(n1 > n2){
		swap(n1, n2);
	}
	t = m/k;
	for(int i=n1+1; i<n2; i++){
		if(i%t==0 && gcd(i/t, k)==1){
			if(flag>0)
				cout << " ";
			cout << i/t << "/" << k;
			flag ++;
		}
	}
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值