- 题目描述:
-
给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。
- 输入:
-
输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。
- 输出:
-
对于每组测试数据,输出为一个整数,表示a和b的公约数个数。
- 样例输入:
-
8 16 22 16
- 样例输出:
-
4 2
五星级题目,其实就是考察对程序的优化,公约数的约数肯定也是他们的公约数!我们只要遍历从找1到sqrt(gdc)的公约数就行,注意这里要加上2!因为在sqrt(x)到x区间还有一个约数!还有就是注意边界特例!
1 #include <iostream> 2 using namespace std; 3 4 int gcd(int a, int b) { 5 int m = a > b ? a : b; 6 int n = a > b ? b : a; 7 return n == 0 ? a : gcd(n, m % n); 8 } 9 10 int main() { 11 int a, b; 12 int max; 13 int count; 14 int i; 15 while (cin >> a >> b) { 16 count = 0; 17 max = gcd(a, b); 18 for (i = 1; i * i < max; ++i) { 19 if (max % i == 0) 20 count += 2; 21 } 22 if (i * i == max) 23 ++count; 24 cout << count << endl; 25 26 } 27 return 0; 28 } 29 /************************************************************** 30 Problem: 1493 31 User: hupo250 32 Language: C++ 33 Result: Accepted 34 Time:30 ms 35 Memory:1520 kb 36 ****************************************************************/