最大公约数和最小公倍数


一、死循环法

#include<stdio.h>
int main(){
int m;
int n;
scanf("%d %d",&m,&n);
int gcd = m > n ? n : m;
while(1){
    if(m%gcd==0 && n%gcd==0){
        printf("%d",gcd);
        break;
    }
    else{
        gcd--;
    }
}
 int lcm = m*n/gcd;
    printf(" %d\n",lcm);
 return 0;
}

循环次数过多超时,int最大数据是2^9 这里如果m和n中最小的数为2^9,则需要循环2^9次,计算机1s一般可以循环2^8次,这里要求400ms,所以超时。

二、暴力转除法

#include<stdio.h>
long long a,b;
long long isp(long long x){
for(long long i=2;i*i<=x;i++){
    if(x%i==0) return 0;//不是质数
}
return 1;//质数

}//isp是判断是否为质数的函数

long long f(long long a,long long b,long long na,long long nb,long long i){
if(na>nb){
    long long t=na;
    na=nb;
    nb=t;
}//交换值操作,是为保障后面的nb%na一定是大的除以小的;
if(isp(na)){
    if(nb%na==0) return na;
    else return 1;
}//不是质数的情况下,若nb能整除na 那na是na和nb的最大公约数;
if(i*i>na||i*i>nb) return 1;//但满足前面条件,i从此以后不再可能是他俩公约数;return1 相当于没乘;
long long res=1;
if(isp(i)){
    while(na%i==0) na/=i;
    while(nb%i==0) nb/=i;
    long long pow=0;
    while((a%i==0)&&(b%i==0)){
        a/=i;
        b/=i;
        pow++;
    }//这个while语句是用来判断a,b里面最多公有多少个质因数i 用pow表示;
    while(pow--) res*=i;//这样可以得到i^pow;
}//这里if语句判断i是否为质数,是为了保证除以的是质因数;
return res*f(a,b,na,nb,i+1);//递归;
}
int main(){
scanf("%lld %lld",&a,&b);
long long gcd=f(a,b,a,b,2);
printf("%lld %lld",gcd,a*b/gcd);//最大公约数*最小公倍数 = a * b;
return 0;
}

模拟转除,但自定义函数较繁琐;

三*、辗转相除法(Euclidean algorithm)

#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
while (1)
{
    int c = a % b;
    if (0 == a % b)
    {
        printf("%d就是最大公约数", b);
        break;
    }
    else
    {
        a = b ; 
        b = c;
    }
}
return 0;
}

声明:Logic & Superegos ' House|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 最大公约数和最小公倍数


Be water,my friend.