[Jobdu] 题目1493:公约数

题目描述:

给定两个正整数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 ****************************************************************/

 

 

你可能感兴趣的:(job)