zoukankan      html  css  js  c++  java
  • 九度 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;
    }
  • 相关阅读:
    Modelsim仿真笔记
    RTP协议
    SHFileOperation使用
    浅谈基于IP网络的H.264关键技术及应用
    jrtplib在windows下的编译步骤
    DEBUG AND RELEASE
    CTree 使用详解 转:
    VC中给树形控件的图标加上工具提示
    MFC六大关键技术之(二)——运行时类型识别(RTTI)
    Linux下编译jrtplib和jthread:
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3577351.html
Copyright © 2011-2022 走看看