zoukankan      html  css  js  c++  java
  • 辗转相除法

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

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

    就是从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 }
  • 相关阅读:
    iOS 内购讲解
    实现抓图的工具2
    实现抓图的工具
    关于胖客户端
    实时进销存
    DataGridView隔行显示不同的颜色
    C#数据库绑定
    VS2012中数据库架构的比较
    delphi使用outputdebugstring调试程序和写系统日志
    drupal7安装中文错误
  • 原文地址:https://www.cnblogs.com/543Studio/p/5165835.html
Copyright © 2011-2022 走看看