《算法设计与分析基础》三种求最大公约数的方法C++实现--欧几里德辗转相除、连续整数检测、质因数相乘

#include 
#include 
using namespace std;
int gcd_1(int x,int y);
int gcd_2(int x,int y);
int gcd_3(int x,int y);
int Sieve(int n);
int *prime;//存放质数的数组指针
int main()
{
	int a=0,b=0;
	cin>>a>>b;
	cout<<"欧几里德辗转相除法:"<=0&&y>=0)
    {
        return (y==0)?x:gcd_1(y,x%y);
    }
    else
    {
        return -1;
    }
}


//函数描述:连续整数检测法求最大公约数
//参数:两个大于等于0的整数
//返回值:这两个数的最大公约数,若返回-1表示出错
int gcd_2(int x,int y)
{
    if(x>0&&y>0)
    {
        int t=(x0)
        {
            if(x%t==0)
            {
                if(y%t==0)
                {
                    return t;
                }
            }
            t--;
        }
    }
    else
    {
        return -1;
    }
}

int gcd_3(int x,int y)
{

    if(x>0&&y>0)
    {
        int result=1;//存放最大公约数
        int min=(x0)
        {
            int i=0;//用来标记prime[]的下标
            while((i=1)&&(y/prime[i]>=1))
            {
                //如果同时是这两个质数的质因数,那就让result*=prime[i];
                if((x%prime[i]==0)&&(y%prime[i]==0))
                {
                    result*=prime[i];
                    x/=prime[i];
                    y/=prime[i];
                }
                else
                {
                    i++;
                }
            }
        }
        return result;
    }
    else
    {
        return -1;
    }


}

//函数描述:计算所有小于等于n的质数,存放在全局的prime[]中
//参数:int类型的数n,为计算的上限
//返回值:所有小于等于n的质数的个数
int Sieve(int n)
{
    //全部初始化为0
    int *tmp=new int[n+1]();
    for(int i=0;i
 
  


我的新浪博客地址:http://blog.sina.com.cn/s/blog_64ecfc2f0101atrl.html

你可能感兴趣的:(算法,最大公约数)