• 关于GCD


    GCD作为缩写意义有多种。它通常表示多核编程的解决方法,也有最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),此外它还是什么***什么的拼音缩写和游戏《鬼吹灯外传》的拼音缩写和“创意群总监”的英文缩写。在这里我讲一下GCD作为最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf)时的一些计算方法。

    GCD

    Common GCD(I)

    题目:给定两个数 $ A,B $ ,求他们的最大公约数

    Example 1 :

    输入:4 9

    输出:1

    Example 2 :

    输入:3 9

    输出:3

    P.S. $ A,B<=1e6 $

    这种题目范围比较小也比较简单可以直接暴力求出

    /*
    *@Author:   ChenShou
    *@Language: C++
    */
    #include <bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<bitset>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<list>
    #include<map>
    #include<set>
    
    //#define DEBUG
    #define RI register int
    #define endl "
    "
    
    using namespace std;
    typedef long long ll;
    //typedef __int128 lll;
    const int N=100000+10;
    const int M=100000+10;
    const int MOD=1e9+7;
    const double PI = acos(-1.0);
    const double EXP = 1E-9;
    const int INF = 0x3f3f3f3f;
    
    int main()
    {
    #ifdef DEBUG
        freopen("input.in", "r", stdin);
        //freopen("output.out", "w", stdout);
    #endif
        //ios::sync_with_stdio(false);
        //cin.tie(0);
        //cout.tie(0);
        //scanf("%d",&t);
        //while(t--){
        //}
        long long int a,b;
        long long int ans=0;
        scanf("%lld %lld",&a,&b);
        if(a>b)swap(a,b);
        
        for(long long int i=1;i<=a&&i<=b;i++){
            if(a%i==0&&b%i==0)ans=i;
        }
        printf("%lld
    ",ans);
    
    #ifdef DEBUG
        printf("Time cost : %lf s
    ",(double)clock()/CLOCKS_PER_SEC);
    #endif
        //cout << "Hello world!" << endl;
        return 0;
    }
    

    Common GCD(II)

    题目:输入N个数, (a_1,a_2,a_3, ...... , a_n) 求这N个数的最大公约数

    Example 1 :

    输入:

    5

    2 4 6 8 10

    输出:

    2

    Example 2 :

    输入:

    2

    7 49

    输出:

    7

    P.S. P.S. $ a_i leq 10^9 ,N leq 10^8 $ 题目保证数据全随机化

    这种题目数据范围比较大也题目难度比较简单可以直接暴力求出,并且注意到“数据全随机化”,这意味着在数据大而且多的情况下往往得到gcd=1,这样的话在gcd=1的时候直接退出程序可以节约一点时间

    /*
    *@Author:   ChenShou
    *@Language: C++
    */
    #include <bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<bitset>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<list>
    #include<map>
    #include<set>
    
    //#define DEBUG
    #define RI register int
    #define endl "
    "
    
    using namespace std;
    typedef long long ll;
    //typedef __int128 lll;
    const int N=100000+10;
    const int M=100000+10;
    const int MOD=1e9+7;
    const double PI = acos(-1.0);
    const double EXP = 1E-9;
    const int INF = 0x3f3f3f3f;
    
    long long int gcd(long long a,long long b){
        return b == 0 ? a : gcd(b,a%b) ;
    }
    
    long long int gcd_(long long a,long long b){
        return b == 0 ? a : gcd(b-a,a) ;
    }
    
    ll stein(ll a, ll b) {
        if(!a)
            return b;
        if(!b)
            return a;
        if(!(a | 1) && !(b | 1))
            return stein(a >> 1, b >> 1) << 1;
        else if(!(a | 1))
            return stein(a >> 1, b);
        else if(!(b | 1))
            return stein(a, b >> 1);
        return stein(abs(a - b), min(a, b));
    }
    
    int main()
    {
    #ifdef DEBUG
        freopen("input.in", "r", stdin);
        //freopen("output.out", "w", stdout);
    #endif
        //ios::sync_with_stdio(false);
        //cin.tie(0);
        //cout.tie(0);
        //scanf("%d",&t);
        //while(t--){
        //}
        long long N;
        scanf("%lld",&N);
        long long int num;
        long long int ans=0;
        while(N--){
            scanf("%lld",&num);
            if(!ans)ans=num;
            else {
                    if(ans>num)swap(ans,num);
                    ans=__gcd(ans,num);
            }
        }
        printf("%lld
    ",ans);
        /*
        for(long long int i=1;i<=a&&i<=b;i++){
            if(a%i==0&&b%i==0)ans=i;
        }
        printf("%lld
    ",ans);
        */
        //printf("%d
    ",gcd(a,b));
        //printf("%d
    ",gcd_(a,b));
        //printf("%d
    ",__gcd(a,b));
    #ifdef DEBUG
        printf("Time cost : %lf s
    ",(double)clock()/CLOCKS_PER_SEC);
    #endif
        //cout << "Hello world!" << endl;
        return 0;
    }
    
  • 相关阅读:
    Drupal 7.23:函数drupal_alter()注释
    请为我们的冷漠付费
    使用Drush管理Drupal站点
    Getting and installing the PEAR package manager
    CKEditor和IMCE构建drupal编辑器
    Drupal资源
    【转】为drupal初学者准备的12个精品课程
    OFBIZ+ECLIPSE
    OFBIZ安装
    CentOS6.4 利用sendEmail发邮件
  • 原文地址:https://www.cnblogs.com/--ChenShou--/p/11280810.html
Copyright © 2020-2023  润新知