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 解题思路:试除法虽然可以判断两个数是否互素,但肯定会超时;所以在这里使用辗转相除法,即欧几里得算法。 欧几里得算法E如下: E=“对输入<x,y>,x和y是二进制表示的自然数: 1)重复下面的操作,指导y=0. 2)赋值x <- x mod y. 3)交换x和y的值。 4)输出x。” 简单来说是这样的: x,y,r1,r2,r3......rn,0 r1=x%y, r2=y%r1, 以此类推。看最后rn是否为1 因为 x = k*y+r1 , 即 r1 = x - k*y (a,b)表示a 和 b 的最大公因子 那么 (x,y)一定是r1的因子,(y,r1)一定是x的因子 所以(x,y)==(y,r1)==(r1,r2)==......==(rn,0)==rn 当且仅当最大公因子为1,即rn==1时,x,y互素;否则不然。 当然,算法思想很简单,但这道题很不容易通过。原因在于输入:每行2个用空格隔开的正整数a,b。a,b < 264 输入的数可以达到2^64,而:
所以,比较合适的类型是unsigned __int64(注意下划线之前有空格!) 输入格式为scanf("%I64d",&a); 注意是大写的I而不是小写的l 用cin>>a不知道为什么不行~~! 代码如下:
|
实验D----两个数的互素判定
最新推荐文章于 2024-04-19 10:57:44 发布