• 辗转相除法


    求最大公约数,我们想想有什么方法可以求呢?

    首先我先来说一下最弱智的算法:

    就是从1开始试,试来试去的就搞出来了……

    代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int m,n,j;
     6     cin>>m>>n;
     7     for(int i=1;i<m;i++)
     8     if(m%i==0 && n%i==0)j=i;
     9     cout<<j;
    10 }

    这种方法太low了……小学生都会啊……

    时间复杂度还是挺高的,对于大数的公约数就没法求了,所以我们想想还有什么方法求

    一般a、b的最大公约数用int gcd(int  a,int b)来表示

    如果我们想求gcd(a,b),我们可以求gcd(b,a%b),这样可以很快的缩小数据范围,因为gcd(a,b)=gcd(b,a%b)啊……多好的算法!!!

    1、证明:设等式a/b=t……a%b(a,b,t,a%b∈Z*),则t*b+a%b=a

                设a,b最大公约数为c

                ∴t*b含有因数c,a含有因数c

                ∴a%b中含有约数c,证毕

    2、做法:任取两正整数进行辗转相除,至有一数等于0时返回最大公约数

    3、时间复杂度:粗略估计O(log max(a,b))

    下面直接上代码,递归想想就好了……

    1 int gcd(int a,int b)
    2 {
    3     if(b==0) return a;
    4     else return gcd(b,a%b);
    5 }
  • 相关阅读:
    CMD指令
    六种Socket I/O模型幽默讲解
    性格与职业的选择
    为什么主引导记录的内存地址是0x7C00?
    pandas数据分析第二天
    pandas数据结构和介绍第一天
    tornado options
    tornado.web.StaticFileHandler
    mysql多条更新
    pandas
  • 原文地址:https://www.cnblogs.com/543Studio/p/5165835.html
Copyright © 2020-2023  润新知