PAT 1062 B-フラクション/// /// 3つのユークリッド最大公約数の最小公倍数数を求める方法

N / M、Mは0ではない。典型的には二つの形式の整数除算の分数として書き込みます。最も簡単な分数は分子と分母の除数がない表現の一部です。
今2等しくない正のフラクショナルN与えられた。1 / M 1及びN 2 / M 2は、K-画分に列挙されているそれらの間の分母の昇順にお願いします。

入力フォーマットは:
単一ライン上の2つの正のスコア形式のN / Mによって与えられ、その後、分母は、隙間によって分離され、K整数正です。保証整数すべてのトピックには1,000以上与えられていません。

出力フォーマットは:
すべてのK-画分を与え両者の分数の分母の行N / Mに記載されている形式で、昇順に、隙間によって分離されました。最初から最後までのラインは余分なスペースを持っていないかもしれません。タイトルは、その少なくとも1つの出力を確認してください。

サンプル入力:
7/18 13/20 12

出力例:
5/12 7/12

アイデア:分母のような2つの和と、このような180サンプル18,20,12の最小公倍数される対象として倍数として三の大共通分母の数k。分数の分子は、次いで(12を除く180)割り切れる見つけることができる倍数180分の70 180分の117、15に増幅され、70から117のまでの数値の間(15割り切れる12を作るために簡略化分母を記載します)容器にソートし、次に出力、分子の出力条件が満たされなければならないことに注意してくださいと12プライム(すなわち、最大公約数が1です)

いくつかの説明を読んだ後2つのピットのブログに記載されています:

  1. 2つのスコアのタイトルは(私が考慮した)左に右必ずしも小規模、大規模、最初の順序ではないことに注意してください
  2. このピットは、2によって対象出力要件に注意を払うテストポイントの原因ではありません、すべてのK-画分に与えられた二つの間の分数の分母に記載されているスコアは間フォーカスを描きます。だから、ループ書かれた判断のための最初のはfor (int i = min; i <= max; i++)間違っています。私はこの点について間違っていた、またはトピックああを検討します
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int gcd(int m, int n); //求最大公约数
int getmin(int x, int y, int z); //求最小公倍数
int getmax(int a, int b, int c); //求三个数中的最大数
int main()
{
	int n1, m1, n2, m2, k;
	scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
	int num = getmin(m1, m2, k); //num是最小公倍数
	int n = num / k;
	n1 *= (num / m1); //将两个分数的分子按倍数放大
	n2 *= (num / m2);
	int min = n1 > n2 ? n2 : n1; //min取分子中最小的,max取最大的
	int max = n1 > n2 ? n1 : n2;
	vector<int> vec;
	for (int i = min + 1; i < max; i++) //注意条件!!!
	{
		if (i % n == 0 && gcd(i / n, k) == 1) //能被n整除,且除了之后和k互质
			vec.push_back(i / n);
	}
	sort(vec.begin(), vec.end()); //排序
	for (int i = 0; i < vec.size(); i++)
	{
		if (i != 0) printf(" ");
		printf("%d/%d", vec[i], k);
	}
	return 0;
}
int getmax(int a, int b, int c)
{
	int m = a > b ? a : b;
	m = m > c ? m : c;
	return m;
}
int getmin(int x, int y, int z)
{
	int i = 1, j, k;
	k = getmax(x, y, z);
	while (true)
	{
		j = k * i;
		if ((j % x == 0) && (j % y == 0) && (j % z == 0))
			break;
		i++;
	}
	return j;
}
int gcd(int a, int b)
{
	int c;
	while (a != 0)
	{
		c = b % a;
		b = a;
		a = c;
	}
	return b;
}

取り付け:3分ユークリッドに感謝
の両方のタグ:

int gcd(int a, int b) //迭代
{
	int c;
	while (a != 0)
	{
		c = b % a;
		b = a;
		a = c;
	}
	return b;
}
int gcb(int a,int b) //递归
{
    return a % b ? gcb(b, a % b) : b;
}

あなたが知っている3つの数字ソリューションの最小公倍数を見つけることができません。

公開された101元の記事 ウォンの賞賛1 ビュー1953

おすすめ

転載: blog.csdn.net/weixin_43318827/article/details/105364605