PAT Basic Level 1062 最简分数 解题思路及AC代码 v1.0

本文详细介绍了PAT乙级题目的1062最简分数问题,包括题目背景、解题思路和完整的AC代码。通过对两个正分数进行通分和调整,找到介于两者之间的以指定分母为最简分数的解决方案。代码中使用了辗转相除法求最大公约数,确保输出的分数是最简形式。
摘要由CSDN通过智能技术生成

1. 题目简述及在线测试位置

1.1 给定两个正分数 和 一个正整数,从小到大打印 以正整数为分母 并 介于两个正分数之间的最简分数。最简分数:分子和分母没有公约数
1.2 在线测试位置: 1062 最简分数

2. 基本思路

2.1 通过题目示例 7/18 13/20 12 进行分析:对输入的两个正分数进行通分,很容易得到:360为分母,分子范围 [141, 233] 的分数 介于这两个分数之间;其中以12为分母的分数,分子一定满足 分子%30=0,比如 150/360,据上述思路编写代码
在这里插入图片描述
2.2 有两点还需注意:对于输入的两个分数,题目并没有保证 数1一定小于数2;另外,2.1的思路 无法直接处理 分子大于等于分母的情况,比如 1/2 1/1 9,此时需要通过同时放大分子分母解决

if (Nume02 >= Deno02) //deal with the situation: 1/2 1/1 9
	{
		Nume02 *= DenoMiddle;
		Deno02 *= DenoMiddle;
	}

	if (Nume01 >= Deno01) //deal with the situation: 1/1 1/2 9
	{
		Nume01 *= DenoMiddle;
		Deno01 *= DenoMiddle;
	}

3. 完整AC代码

#include <iostream>
using namespace std;

int GCD(int a, int b); //Great Common Divisor

int main()
{		
	int Nume01, Nume02, Deno01, Deno02, Deno;
	int DenoMiddle, Key;
	int NumeStart, NumeEnd;  bool flag = true;

	scanf("%d/%d", &Nume01, &Deno01);
	scanf("%d/%d", &Nume02, &Deno02);
	scanf("%d", &DenoMiddle);

	if (Nume02 >= Deno02) //deal with the situation: 1/2 1/1 9
	{
		Nume02 *= DenoMiddle;
		Deno02 *= DenoMiddle;
	}

	if (Nume01 >= Deno01) //deal with the situation: 1/1 1/2 9
	{
		Nume01 *= DenoMiddle;
		Deno01 *= DenoMiddle;
	}

	Deno = Deno01 * Deno02; //Common denominator
	NumeStart = Nume01 * Deno02;
	NumeEnd = Nume02 * Deno01;

	Key = Deno / DenoMiddle; //key=360/12

	if (NumeStart > NumeEnd) //maybe NumberOne greater than NumberTwo
	{
		int tmp = NumeStart;
		NumeStart = NumeEnd;
		NumeEnd = tmp;
	}

	for (int i = NumeStart + 1; i < NumeEnd; i++)
	{
		if (!(i % Key) && flag && GCD(i / Key, DenoMiddle) == 1)
		{
			cout << i / Key << "/" << DenoMiddle;
			flag = false;
		}
		else if (!(i % Key) && !flag && GCD(i / Key, DenoMiddle) == 1)
			cout << " " << i / Key << "/" << DenoMiddle;
	}

	return 0;
}

int GCD(int a, int b) //辗转相除法
{
	int c;
	while (a % b)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return b;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值