[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 ****************************************************************/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值