九度 1493 公约数

题目描述:

 

给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。

 

思路

 

1. 编程之美上给出了求解最大公约数的正规解法

2. 求出最大公约数后, 然后就不知道怎么做了. 上网查了资料, 才发现对最大公约数进行质因数分解就能得出所有的公约数的组合

3. 质因数分解的话, 使用 map 存储 key-value 比较合适

 

代码

 

#include <stdio.h>
#include <map>
#include <iostream>
using namespace std;

int gcd(int x, int y) {
    if(x == 1 || y == 1)
        return 1;

    if(x == y)
        return x;

    if(y > x)
        swap(x,y);

    if((x&1) && (y&1)) {
        return gcd(x-y, y);
    }else if((x&1) &&(!(y&1))) {
        return gcd(x, y/2);
    }else if ((!(x&1)) && (y&1)) {
        return gcd(x/2, y);
    }else{
        return 2*gcd(x/2, y/2);
    }
}

int num(int n) {
    map<int, int> record;
    for(int i = 2; i <= n && n != 1; i ++) {
        while(n >= i && n % i == 0) {
            record[i] ++;
            n /= i;
        }
    }
    int res = 1;
    map<int, int>::iterator it_map;
    for(it_map = record.begin(); it_map != record.end(); it_map ++) {
        res *= (it_map->second+1);
    }
    return res;
}

int main() {
    //freopen("testcase.txt", "r", stdin);
    int a, b;
    while(scanf("%d%d", &a, &b) != EOF) {
        int maxgcd = gcd(a,b);
        
        cout << num(maxgcd) << endl;
    }
    return 0;
}

 

posted @ 2014-03-02 21:46  SangS  阅读(259)  评论(0编辑  收藏  举报