湖大OJ-实验D----两个数的互素判定

实验D----两个数的互素判定
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
Total submit users: 190, Accepted users: 181
Problem 13121 : No special judgement
Problem description

  称两个正整数是互素的,当它们没有大于1的公因子的时候。比如,4与9就是互素的,尽管4与9都不是素数,但4与9只有一个公因子:1,所以它们互素。但4与22就不是互素的,因为它们有一个大于1的公因子:2。
  你的任务,给你2个数,判断它们是否互素。

Input

  有多个测试序列,测试结束于测试文件结束; 
  每个测试序列占一行,每行2个用空格隔开的正整数a,b。a,b < 264

Output

  对于每对输入的整数,输出”YES”,如果它们互素;否则,输出”NO”。

Sample Input
  22 4
  4 9
Sample Output
  NO
  YES

1、算法设计思路

A:我们先来比较总结一下GUN中整形的范围:

int                   :-2147483648 ~ +2147483647 (4 Bytes)

unsigned int     :0 ~ 4294967295 (4 Bytes)

long == int

long long          :-9223372036854775808 ~ +9223372036854775807 (8 Bytes)

double              :1.7 * 10^308 (8 Bytes)

unsigned int     :0~4294967295

__int64的最大值:9223372036854775807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:18446744073709551615

B:从上面的结果可以看到,unsigned __int64可以符合题目的数据要求

C:用辗转相除的方法来计算最大公约数,这里使用辗转相除的递归法

2、实验总结

  (这题也好水)实验时要注意题目所给数据的取值范围;对于辗转相除求最大公约数,可以用非递归的或者递归的形式,两者的复杂度相差无几,鉴于递归形式的思路比较明确,而且方便编写(几行代码就可以搞定),所以使用递归形式的辗转相除。

3、 AC代码

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
unsigned __int64 gcd(unsigned __int64 a, unsigned __int64 b)
{
    if (b > 0)
    {
        return gcd(b, a % b);
    }
    return a;
}
int main(){
	unsigned __int64 a,b;
	  while(cin>>a>>b){
		if(gcd(a,b)==1) {
			printf("YES\n");
		}
		else
			printf("NO\n");
	}
	return 0;
}
posted @ 2016-01-12 11:19  Just-Live  阅读(1393)  评论(0编辑  收藏  举报