实验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。 |
Input |
有多个测试序列,测试结束于测试文件结束; |
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 "); } else printf("NO "); } return 0; }