首页 > 其他 > 详细

2014年王道论坛研究生机试练习赛(二)set 3 公约数

时间:2014-03-03 16:38:46      阅读:561      评论:0      收藏:0      [点我收藏+]

题目描述:

 

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

 

思路

 

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

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

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

 

代码

 

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

2014年王道论坛研究生机试练习赛(二)set 3 公约数,布布扣,bubuko.com

2014年王道论坛研究生机试练习赛(二)set 3 公约数

原文:http://www.cnblogs.com/xinsheng/p/3577351.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!