- 题目描述:
-
给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。
- 输入:
-
输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。
- 输出:
-
对于每组测试数据,输出为一个整数,表示a和b的公约数个数。
- 样例输入:
-
8 1622 16
- 样例输出:
-
42
五星级题目,其实就是考察对程序的优化,公约数的约数肯定也是他们的公约数!我们只要遍历从找1到sqrt(gdc)的公约数就行,注意这里要加上2!因为在sqrt(x)到x区间还有一个约数!还有就是注意边界特例!
1 #include2 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: 149331 User: hupo25032 Language: C++33 Result: Accepted34 Time:30 ms35 Memory:1520 kb36 ****************************************************************/