題目背景
眾所周知,我們稱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 }