zoukankan      html  css  js  c++  java
  • SDUSTOJ

    SDUSTOJ - 1298 递归的辗转相除法

    Description
    辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
    两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。根据这个原理,不难得出用辗转相除法求最大公约数的递归定义:
    这里写图片描述
    下面,给出两个正整数A和B,求他们的最大公约数(gcd(A,B))和最小公倍数(lcm(A,B))。

    Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词是不允许被使用的。如果提交的程序中包含了下列的关键词之一,就会产生这个错误。
    被禁用的关键字:循环语句for、while,甚至包括分支语句的switch、case、goto、break。
    被禁用的头文件:math.h、stdlib.h

    Input
    输入为两个整数A和B,满足0 < A , B < 2^15

    Output
    输出两数,分别为gcd(A,B)和lcm(A,B),用一个空格分隔。

    Sample Input
    24 36

    Sample Output
    12 72

    AC代码

    #include <stdio.h>
    int gcd(int x, int y)
    {
        return y ? gcd(y, x%y) : x;
    }
    /* 复杂gcd */
    //int gcd(int a, int b) //求最大公约数
    //{
    //    if( a == b )
    //        return a;
    //    else if( a != 0 && b == 0 )
    //        return a;
    //    else if( b != 0 && a == 0 )
    //        return b;
    //    if( a > b )
    //    {
    //        int temp;
    //        temp = a;
    //        a = b;
    //        b = temp;
    //    }
    //    int mid = b % a;
    //    while( mid != 0 )
    //    {
    //        b = a;
    //        a = mid;
    //        mid = b % a;
    //    }
    //    return a;
    //}
    int lcm(int a, int b){
        int x, y ;
        x = a * b;
        y = x / gcd(a,b);
        return y;
    }
    
    int main()
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d %d
    ",gcd(a,b),lcm(a,b));
    
        return 0;
    }
  • 相关阅读:
    java线程(1)-线程同步
    Scala:(3)数组
    Codeforces 899F Letters Removing
    拼图游戏的可解性
    Hash
    哈夫曼编码
    莫比乌斯
    FFT
    Ropes
    区间合并
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740659.html
Copyright © 2011-2022 走看看