• 九度 题目1493:公约数


    题目1493:公约数

    时间限制:1 秒

    内存限制:128 兆

    特殊判题:

    题目描述:

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

    输入:

    输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。

    输出:

    对于每组测试数据,输出为一个整数,表示a和b的公约数个数。

    样例输入:
    8 16
    22 16
    样例输出:
    4
    2
    来源:
    2013年王道论坛计算机考研机试全真模拟考试
    思路:比较简单的问题,对2数质因数分解。寻找拥有共同质因数,取最小的。关键在于编码。
    #include <iostream>
    #include <string.h>
    #include <string>
    #include <algorithm>
    #include <stdio.h>
    #include <queue>
    #include <set>
    #include <limits.h>
    #include <fstream>
    #include <map>
    #include <math.h>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std ;
    const int size=10008 ;
    int prime[size] ;
    bool is_prime[size] ;
    int prime_size ;
    void make_prime(){
       prime_size=0 ;
       memset(is_prime,0,sizeof(is_prime)) ;
       for(int i=2;i<size;i++){
          if(!is_prime[i])
             prime[prime_size++]=i ;
          for(int j=0;j<prime_size&&prime[j]*i<size;j++){
             is_prime[prime[j]*i]=1 ;
             if(i%prime[j]==0)
                break ;
          }
       }
    }
    struct Me{
        int N , M ;
        map<int ,int>mp ;
        Me(){}
        Me(int n, int m):N(n),M(m){}
        void make_prime_factor(int N){
            mp.clear() ;
            for(int i=0;i<prime_size&&prime[i]*prime[i]<=N;i++){
                if(N%prime[i]==0){
                    int n=0 ;
                    while(N%prime[i]==0){
                        n++ ;
                        N/=prime[i] ;
                    }
                    mp[prime[i]]=n ;
                }
            }
            if(N!=1)
                mp[N]=1 ;
        }
        int gao_qi(){
           make_prime_factor(N) ;
           int ans=1 ;
           for(int i=0;i<prime_size&&prime[i]*prime[i]<=M;i++){
                if(M%prime[i]==0){
                    int n=0 ;
                    while(M%prime[i]==0){
                        n++ ;
                        M/=prime[i] ;
                    }
                    ans*=(Min(mp[prime[i]],n)+1) ;
                }
            }
            if(M!=1)
                ans*=(Min(mp[M],1)+1) ;
            return ans ;
        }
    };
    int main(){
      make_prime() ;
      int n, m;
      while(scanf("%d%d",&n,&m)!=EOF){
         Me me(n,m) ;
         printf("%d
    ",me.gao_qi()) ;
      }
      return 0 ;
    }
  • 相关阅读:
    开始制作国产的 scratch
    七个对我最重要的职业建议(译文)
    不要在功能上竞争
    来看看机智的前端童鞋怎么防盗
    悬疑塑成天才?
    Linux常用命令之重启关机命令
    Linux常用命令之网络命令
    Linux常用命令之文件搜索命令
    Linux常见命令之权限管理命令
    Linux常见命令之文件处理命令
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3252257.html
Copyright © 2020-2023  润新知