求两个数的最大公约数:Java、Scala

本文介绍了辗转相除法的概念及其应用,通过实例演示了如何求解任意两个数的最大公约数,并提供了两种实现方式:循环和递归。同时,展示了一段使用Python和Scala语言实现该算法的代码。

辗转相除法.

  当两个数都较大时,采用辗转相除法比较方便.其方法是:

  以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.

  例如:求4453和5767的最大公约数时,可作如下除法.

  5767÷4453=1余1314

  4453÷1314=3余511

  1314÷511=2余292

  511÷292=1余219

  292÷219=1余73

  219÷73=3

  于是得知,5767和4453的最大公约数是73.

  辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.      


class ex1
{
  int gys1(int m, int n)   // 循环实现
  {
    int k,y;
    if(m<n)
    {
      k=m;
      m=n;
      n=k;
    }
    while(m%n!=0)
    {
     y=m%n;
     m=n;
     n=y; 
    }
    return n;
  }

  int gys2(int m,int n)  //递归实现
  {
   int k,y;
   if(m<n)
    {
      k=m;
      m=n;
      n=k;
    }   
   y=m%n;
   if(y==0)
   {
     return n;
   }
   else
   {
     m=n;
     n=y;
     return gys2(m,n);
   }
  }

  public static void main(String[] args)
  {
    ex1 e1=new ex1();
    System.out.println(e1.gys1(256,128));
    ex1 e2=new ex1();
    System.out.println(e1.gys2(256,128));
  }
}

scala实现:

private def gcd(a: Int , b: Int ):  Int = 
    if  (b == 0) a else gcd(b, a % b)




转载于:https://my.oschina.net/hanzhankang/blog/200340

本关任务:定义一个柯里化函数,个参数的最大公约数。 相关知识 为了完成本关任务,你需要掌握: 什么是柯里化; 什么是闭包。 函数柯里化 柯里化,俗称“部分值”。一个柯里化函数首先是会接受一些参数,但是接受这些参数之后,该函数并不会立即值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来。等到函数被真正需要值的时候,之前传入的所有参数会被一次性用于值。也就是说,柯里化是函数式编程的一种技巧,用于把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数。 实例: 首先我们定义一个函数: def add(x:Int,y:Int)=x+y 那么我们应用的时候,应该是这样用:add(1,2)。 现在我们把这个函数变一下形: def add(x:Int)(y:Int) = x + y 那么我们应用的时候,应该是这样用:add(1)(2),最后结果都一样是 3,这种方式(过程)就叫柯里化。 实现过程: add(1)(2) 实际上是依次调用个普通函数(非柯里化函数),第一次调用使用一个参数 x,返回一个函数类型的值,第二次使用参数 y 调用这个函数类型的值。 实质上最先演变成这样一个方法: def add(x:Int)=(y:Int)=>x+y 那么这个函数是什么意思呢? 接收一个 x 为参数,返回一个匿名函数,该匿名函数的定义是:接收一个 Int 型参数 y,函数体为 x+y。现在我们来对这个方法进行调用。 val result = add(1) 返回一个result,那 result 的值应该是一个匿名函数: (y:Int)=>1+y 所以为了得到结果,我们继续调用 result。 val sum = result(2) 最后打印出来的结果就是 3。 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i * 10 函数体内有一个变量 i,它作为函数的一个参数。如下面的另一段代码: val multiplier = (i:Int) => i * factor 在 multiplier 中有个变量:i 和 factor。其中的一个 i 是函数的形式参数,在 multiplier 函数被调用时,i 被赋予一个新的值。然而,factor 不是形式参数,而是自由变量,考虑下面代码: var factor = 3 val multiplier = (i:Int) => i * factor 这里我们引入一个自由变量 factor,这个变量定义在函数外面。 这样定义的函数变量 multiplier 成为一个"闭包",因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。 有意思的是,当这个自由变量发生变化时,Scala 的闭包能够捕获到这个变化,因此 Scala 的闭包捕获的是变量本身而不是当时变量的值。 同样的,如果变量在闭包在发生变化,也会反映到函数外面定义的闭包的值。比如: 可以看到在闭包中修改 sum 的值,其结果还是传递到闭包的外面。 编程要 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,计算数的最大公约数。具体要如下: 定义一个名为 gcd(a: Int)(b: Int) 的柯里化函数,返回值类型为 Int,计算 a、b 数的最大公约数。 测试说明 平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 测试输入: 33 58 预期输出: 1 测试输入: 10 2 预期输出: 2
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值