nyoj 189 兔子的烦恼(一)(辗转相除法求最大公约数)

兔子的烦恼(一)

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述

在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在问,兔子能否避免这场灾难?

例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,0;

输入
有多组测试数据,不超过1000组;

每组有两个整数m,n(0<m,n<=1000);

注意:程序以文件结束符“EOF”结束输入。

输出
兔子能避免这场灾难输出YES,否则输出NO;
样例输入
1 22 2
样例输出
NOYES
来源
hdu
上传者

苗栋栋

这道题说到底就是求m和n的最大公约数。在杭电上也做过这道题,不是用的这样的方法。结果同样的方法在这里wa了,说明在杭电做的方法错了。也说明杭电的这道题的数据很水。

#include<stdio.h>
int gcd(int m,int n)
{
	int temp,r;
	if(m>n)
	temp=m,m=n,n=temp;
	while(m)
	r=n%m,n=m,m=r;
	return n;
}
int main()
{
	int m,n;
	while(scanf("%d %d",&m,&n)!=EOF)
	{
		if(m==1||n==1)
		{
			printf("NO\n");
			continue;
		}
		if(gcd(m,n)==1)
		printf("NO\n");
		else
		printf("YES\n");
	}
	return 0;
}        

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 11:59:33

nyoj 189 兔子的烦恼(一)(辗转相除法求最大公约数)的相关文章

鸡兔同笼问题、百鸡问题、辗转相除法求最大公约数

一.鸡兔同笼 鸡和兔子35只,腿一共有94条,求出鸡和兔子的数量各是多少?(鸡的数目是23,兔子的数目是12) $n = 0; for($ i=1;$i<35;$i++){ $n ++; //n=34; $ j=35-i; if(i*2+j*4==94){ printf("鸡的数目是%d只, 兔子的数目是%d只",$i,$j); } } 此时,循环进行了34次.但是,有些循环是无意义的,因为得到了结果,循环还在继续往下执行.我们知道:两个未知数,两个方程,其方程组的解唯一!那么我

辗转相除法求最大公约数

辗转相除法求最大公约数 设两数为a.b(b<a),求它们最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r).若r1=0,则(a,b)=b:若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止.其最后一个非零余数即为(a,b). 从某处找的证明: 原理及其详细证明 在介绍这个方法之前,先说明整除性的一些特点(下文的所有数都是正整数,不再重覆),我们可以这样给出

辗转相除法求最大公约数,非goto

1 #include<iostream> 2 using namespace std; 3 //不推荐用goto,当然用它更快 4 //辗转相除法求两数的最大公约数 5 int gcd(long int a,long int b){ 6 int x=a<b?a:b; 7 //获得较小者,用来做循环的约束值 8 9 for(int i=0;i<x;x++){ 10 //循环 11 if(a>b){ 12 int r=a%b;//取余数 13 if(r==0){//能否整除判断

辗转相除法求最大公约数------一行代码

今天学到一行代码,感觉好牛逼--------当然是老师上课讲的. 辗转相除法是求最大公约数最好的方式了吧! 辗转相除法原理我也不想多说,百度一下就可以了(基本就是用大数与小数取余,再用比余数大一点的数与余数取余, 反复直到出现余数为0,那个比0大一点的数就是最大公约数) 好了,废话不多说了------上代码 int gcd(int m, int n){ return n % m == 0 ? m : gcd(n%m, m); } 详细讲解一下: 优势是使用了递归,一直让大数与小数取余,直到出现0

辗转相除法求最大公约数和最小公倍数分析

求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p

C辗转相除法求最大公约数的实现

int gcd(int a, int b)//求最大公约数,a为分子,b为分母 { if(b == 0) return a; return gcd(b,a%b); }

辗转相除法求最大公约数和最小公倍数

要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } 代码: int gongyue() { int yushu,a,b; while(b) { yushu=a%b; a=b; b=yushu; } return b; } 此子函数可以求出两个数的最大公约数n    最小公倍数为a*b/n:

[算法]辗转相除法求最大公约数

辗转相除法用得比较多,今天Mark一下.具体做法就是:如果q和r分别是m除以n的商及余数,即m=nq+r,那么m和n的最大公约数等于n和r的最大公约数. 代码如下: public static int gcd(int m, int n) { return n == 0 ? m : gcd(n, m % n); }

c语言:辗转相除法求最大公约数、最小公倍数

辗转相除法,又称欧几里得算法.两个正整数a和b(a>b),它们的最大公约数等于余数c和较小的数b之间的最大公约数.最小公倍数=两数之积/最大公约数 #include <stdio.h>int get1(int a, int b){ if (a < b) { int c = a; a = b; b = c; } while (a%b != 0) { b = a%b; a = b; } return b;}int get2(int a,int b){ return a*b / get1