关于最大公约数算法的思考

23 篇文章 2 订阅

1,欧几里得算法
2,暴力求解算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
3,对暴力发的一个优化:主要是对于k的值更新做相应的优化,本来最开始想到的是每次都取较小值n除以相应的数(1,2,3,5、、、后边就是素数递增),但是想到每次运用此法都要求相应的素数,这样就加大了程序的运算量,于是就选择了更新值时选择除以递增的自然数
本文纯属作者无事瞎想,不足之处,还望见谅

代码如下:

#include <iostream>
using namespace std;
int main ()
{
    long long Euclid(long long m,long long n,long long &count);   //欧几里得算法
    long long Function(long long m,long long n,long long &count);  //普通算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
    long long FunctionPlus(long long m,long long n,long long &count);  //普通算法改进版
    long long m,n,k,count=0;
    cout<<"Please input m and n: ";
    cin>>m>>n;
    if(m<n)   //保证 n 不大于 m 
    {
        m=m+n;
        n=m-n;
        m=m-n;
    }

    cout<<"欧几里得算法:"<<endl;     //运用欧几里得算法求出最大公约数,并输出计算次数 
    k = Euclid(m,n,count);
    cout<<"The gcd is:"<<k<<"  ";
    cout<<"The number of operation is:"<<count<<endl;
    count = 0;   //把 count 清零 
    cout<<"普通算法:"<<endl;     //运用普通算法求出最大公约数,并输出计算次数 
    k=Function(m,n,count);
    cout<<"The gcd is:"<<k<<"  ";
    cout<<"The number of operation is:"<<count<<endl;   
    count = 0; 
    cout<<"普通算法改进版:"<<endl;
    k=FunctionPlus(m,n,count);
    cout<<"The gcd is:"<<k<<"  ";
    cout<<"The number of operation is:"<<count<<endl; 

    return 0;
} 

long long Euclid(long long m,long long n,long long &count)   //欧几里得算法
{
    long long x;  //中间变量
    while(n!=0)
    {
        x=m%n;
        m=n;
        n=x;
        count++;
    }
    return m; 
}

long long Function(long long m,long long n,long long &count)  //普通算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
{
    long long x;  //中间变量
    x=n;
    while(m%x!=0 || n%x!=0)
    {
        x--;
        count++;
     } 
    return x;
}

long long FunctionPlus(long long m,long long n,long long &count)  //普通算法改进版
{
    long long x;  //中间变量
    x=n;
    while(m%x!=0 || n%x!=0)
    {
        x=(long long)(n/(count+2));
        count++;
    } 
    return x;
}

部分运行结果如下:

第一组测试:
Please input m and n: 60 24
欧几里得算法:
The gcd is:12 The number of operation is:2
普通算法:
The gcd is:12 The number of operation is:12
普通算法改进版:
The gcd is:12 The number of operation is:1


Process exited after 4.625 seconds with return value 0
请按任意键继续…

第二组测试:
Please input m and n: 5 3
欧几里得算法:
The gcd is:1 The number of operation is:3
普通算法:
The gcd is:1 The number of operation is:2
普通算法改进版:
The gcd is:1 The number of operation is:1


Process exited after 2.884 seconds with return value 0
请按任意键继续…

第三组测试:
Please input m and n: 78945 456
欧几里得算法:
The gcd is:57 The number of operation is:2
普通算法:
The gcd is:57 The number of operation is:399
普通算法改进版:
The gcd is:57 The number of operation is:7


Process exited after 7.063 seconds with return value 0
请按任意键继续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值