U10783 名字被和谐了

U10783 名字被和谐了

题目背景

众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0。

众所周知,若g既是a的约数也是b的约数,我们称g是a、b的一个公约数。

众所周知,a、b最大的那个公约数就叫最大公约数。

题目描述

现在对于给定的两个正整数a、b,你需要求出它们次大的公约数(second greatest common divisor)。

输入输出格式

输入格式:

第一行两个正整数数a、b。

输出格式:

第一行一个数,表示a、b的次大公约数。若a、b的公约数只有一个,则输出-1。

输入输出样例

输入样例#1:
2 3
输出样例#1:
-1

说明

测试点1..4:a、b≤10^5

测试点1..10:1≤a、b≤10^9

分析

可以证明,a,b的所有公约数都被组大公约数所包含,都是最大公约数的因数,所以先求出最大公约数,然后在最大公约数中在找次大公约数。

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 
 4 using namespace std;
 5 
 6 int Gcd(int x,int y)
 7 {
 8     if (y==0) return x;
 9     return Gcd(y,x%y);
10 }
11 
12 bool Isprime(int x)
13 {
14     for (int i=2; i*i<=x; ++i)
15     {
16         if (x%i==0) return false;
17     }
18     return true;
19 }
20 
21 int main()
22 {
23     int d,x,y;
24     scanf("%d%d",&x,&y);
25     d = Gcd(x,y);
26 
27     if (d==1)
28     {
29         printf("-1");
30         return 0;
31     }
32     if (Isprime(d))
33     {
34         printf("1");
35         return 0;
36     }
37     for (int i=2; ; ++i)
38     {
39         if (d%i==0) 
40         {
41             printf("%d",d/i);
42             return 0;        
43         }
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/mjtcn/p/7348656.html