2104 hide handkerchief

在这里插入图片描述
在这里插入图片描述
此题的关键在于如何将题目转化为我们我们熟悉的的样式,即两个数是否互质(保证两个数的最大公因数为1即可)。
如以N=4 M=2为例,根据题意Haha找的箱子始终为1号和3号箱,始终都不会找为他两公因数的2号和4号箱
代码如下:

#include <iostream>
using namespace std;
//方法一
/*int gongmax(int N, int M)
{
	int i;
	for (i = 2; i <= M; i++)
	{
		if (N % i == 0 && M % i == 0)
			return i;
	}
	return 1;
}*/
//方法二
int gongmax(int n, int m)
{
	int r;
	while (m)
	{
		r = n % m;
		n = m;
		m = r;
	}
	return n;
}
int main()
{
	int M, N, m;
	while (scanf("%d %d", &N, &M) != EOF && (M != -1 || N != -1))
	{

		m = gongmax(N, M);
		if (m == 1)
			printf("YES\n");
		else
			printf("POOR Haha\n");
	}
	return 0;
}

我此处对于判断是否互质用了两种方法:
方法一:即判断在2至M中是否可以找到一个数可以N % i == 0 和 M % i == 0,若满足此条件,即i为两数的公因数,则不互质(但此种方法用在此题中会超时)。
方法二:短除法,即执行式子M%N=A,然后N赋值给M,A赋值给N一直这样循环,直到某一次除数除以余数的余数为0为止,此时的除数即为最大公因数,若此时的除数为1则两数互质(通过短除法可以大大提高效率)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值