Scala函数式编程实战(下)

简介: Scala函数式编程实战(下)

2-10 求一元二次方程的根

利用公式x1 = (-b + sqrt(b* b-4* a* c))/(2* a), x2 = (-b - sqrt(b* b-4* a* c))/(2* a)求一元二次方程ax^2 + bx + c =0的根,其中a不等于0。


输入格式:

第一行是待解方程的数目n。

其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax^2 + bx + c =0的系数。


输出格式:

输出共有n行,每行是一个方程的根:

若是两个实根,则输出:x1=…;x2 = …

若两个实根相等,则输出:x1=x2=…

若是两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i


所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。

x1和x2的顺序:x1的实部>Re的实部||(x1的实部==x2的实部&&x1的虚部>=x2的虚部)


输入样例:

3
1.0 3.0 1.0
2.0 -4.0 2.0
1.0 2.0 8.0


输出样例:

x1=-0.38197;x2=-2.61803
x1=x2=1.00000
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i


import scala.io.StdIn
import scala.math._
object Main {
  def main(args: Array[String]): Unit = {
      var n = StdIn.readInt();
      var i = 0
    while(i < n) {
        i += 1
        var s = StdIn.readLine().split(" ");
        var a = s(0).toDouble;
        var b = s(1).toDouble;
        var c = s(2).toDouble;
        var p : Double = b * b - 4 * a * c;
        var x1 : Double = -b / (2 * a);
        if(b == 0) x1 = 0;
        if(p > 0) printf("x1=%.5f;x2=%.5f\n",(-b + math.sqrt(p)) / (2 * a),(-b - math.sqrt(p)) / (2 * a));
        else if(p == 0) printf("x1=x2=%.5f\n",x1);
        else
        {
            p = -p;
            var y1 = math.sqrt(p) / (2 * a);
            var y2 = -math.sqrt(p) / (2 * a);
            printf("x1=%.5f%+.5fi;x2=%.5f%+.5fi\n",x1,y1,x1,y2);
        }
    }
  }
}


2-11 循环相克令

这循环相克令是一个两人玩的小游戏。

令词为“剪刀、石头、布”,两人同时说出令词,同时做出一个动作——剪刀的动作是伸出“食指+中指”;石头的动作是“五指握紧”伸出;布的动作是“五指打开”伸出。

双方以此动作判定输赢,剪刀赢布、布赢石头、石头赢剪刀,动作相同则视为平局。

现在给定你一系列的动作组合,请你判断游戏结果。


输入格式:

第一行包含整数 T(1≤T≤100),表示共有 T 组测试数据。

接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 Scissors、Rock 、Paper中的一个,这三个单词分别代表剪刀、石头、布。


输出格式:

如果第一个玩家赢了,则输出 Player1。

如果第二个玩家赢了,则输出 Player2。

如果平局,则输出 Repetition。


输入样例:

3
Scissors Paper
Rock Rock
Scissors Rock


输出样例:

Player1
Repetition
Player2


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
      var n = StdIn.readInt()
      var i = 0
      while(i < n) {
          i += 1;
          var k = 0;
          var s=StdIn.readLine().split(" ")
          var s1=s(0)
          var s2=s(1)
          if(s1 == "Scissors" && s2 == "Paper" ||
             s1 == "Rock" && s2 == "Scissors" ||
             s1 == "Paper" && s2 == "Rock") println("Player1");
          else if(s1 == s2) println("Repetition")
          else println("Player2")
    }
  }
}


2-12 精准运动

小明 正在学习建模。她对带有活动部件的模型很感兴趣。作为她的第一个任务,她制作了一个大小2×n的矩形盒子,其中包含两个平行的导轨和每个导轨上的矩形条。短条的尺寸1×a,长条的尺寸 1×b. 长杆的两端各有一个塞子,而短的总是在这两个塞子之间。


只要短杆位于挡块之间,杆就可以沿着导轨移动,一次一根杆。所以,小明在每个矩形条移动选择其中一个条并移动它,而另一个保持在原位。最初,两个条都与盒子的一侧对齐,小明希望它们以尽可能少的移动到另一侧对齐。为了实现目标,他最少需要移动多少次?


输入格式:

输入在一行中给出3个整数a、b和c(1<=a<b<=n<=10^7),其间以空格分隔。

输出格式:

对每一组输入,在一行中输出小明最少需要移动的次数。


输入样例:

1 3 6
2 4 9


输出样例:

5
7


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
    while(true) {
        var s = StdIn.readLine().split(" ");
        var a = s(0).toInt;
        var b = s(1).toInt;
        var c = s(2).toInt;
        if(b == c) println(1);
        else
        {
            var k = 0;
            var s = b - a
            while(b < c || a < c)
            {
                if(b < c)
                {
                    b += s;
                    k += 1;
                }
                if(a < c)
                {
                    a += s
                    k += 1
                }
            }
            println(k)
        }
    }
  }
}


2-13 sum

本题目要求读入1个整数n,然后输出1~n之间所有整数的和。


输入格式:

输入在一行中给出1个绝对值不超过10000的整数n。

输出格式:

对每一组输入,在一行中输出1~n之间所有整数的和。


输入样例:

-3
3


输出样例:

-5
6


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
      while(true)
      {
          var n = StdIn.readInt();
          var sum = 0;
          if(n > 0)
          {
              for(i <- 1 to n)
              {
                  sum += i;
              }
              println(sum);
          }
          else
          {
              for(i <- n to 1)
              {
                  sum += i;
              }
              println(sum);
          }
      }
  }
}


2-14 菱形

输入一个奇数n,输出一个由‘*’构成的n阶空心菱形。


输入格式:

一个奇数n。

输出格式:

输出一个由‘*’构成的n阶实心菱形。


具体格式参照输出样例。


输入样例:

5
• 1


输出样例:

*  
 * * 
*   *
 * * 
  *


import scala.io.StdIn
import scala.math._ 
object Main {
 def main(args: Array[String]): Unit = {
     var n = StdIn.readInt();
     var cx = n / 2
     var cy = n / 2
     for(i <- 0 to n - 1)
     {
         for(j <- 0 to n - 1)
         {
             if(math.abs(i - cx) + math.abs(j - cy) == n / 2) print('*');
             else print(' ');
         }
         println();
     }
 }
}


2-15 特殊数字

我们规定,对于一个整数 a,如果其各位数字相加之和能够被 4 整除,则称它是一个特殊数字。

现在,给定一个整数 n,请你计算并输出不小于 n 的最小特殊数字。


输入格式:

一个整数 n,1≤n≤1000。

输出格式:

一个整数,表示不小于 n 的最小特殊数字。


输入样例:

42


输出样例:

44


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
      var n = StdIn.readLine();
      var x = n.toInt;
      var t = 0;
      for(i <- x to 1004)
      {
          var nn = i.toString
          var sum : Int = 0;
          for(c <- nn)
          {
              sum += c.toInt;
          }
          if(sum % 4 == 0 && t == 0)
          {
              print(i);
              t = 1;
          }
      }
  }
}


2-16 斐波那契数

给你一个整数n,求出它的斐波那契数是多少?


输入格式:

在一行中给出1个不超过30的正整数n。

输出格式:

在一行中输出斐波那契数的值。


输入样例:

5


输出样例:

1 1 2 3 5


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
      var n = StdIn.readInt();
      var a = 1;
      var b = 1;
      for(i <- 1 to n)
      {
          print(a + " ");
          var c = a + b;
          a = b;
          b = c;
      }
  }
}


2-17 猴子吃桃子问题

有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第n天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?


输入格式:

在一行中给出1个不超过30的正整数n。

输出格式:

在一行中输出最初的桃子个数。


输入样例:

10


输出样例:

桃子=1534


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
    var n = StdIn.readInt();
      var s = 1;
      for(i <- 1 to n - 1)
          s = (s + 1) * 2;
      print("桃子="+s);
  }
}


三:第3章 数据结构知识

3-1 输出素数

编写一个循环,判断A~B之间有多少个素数,并输出所有素数。素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。


输入格式:

输入在一行中给出2个正整数A和B(10<=a,b<=10000)。

输出格式:

输出A~B之间的所有素数,且每个素数占一行。


输入样例:

10 20


输出样例:

11
13
17
19


import scala.io.StdIn
object Main {
    def f(n : Int): Int =  // 判断素数
    {
        if(n < 2) return 0
        var i = 2;
        for(i <- 2 to n / i)
            if(n % i == 0) return 0
        return 1
    }
  def main(args: Array[String]): Unit = {
      while(true)
      {
          var s = StdIn.readLine().split(' ');
          var A = s(0).toInt;
          var B = s(1).toInt;
          for(i <- A + 1 to B)
          {
              if(f(i) != 0) println(i);
          }
      }
  }
}


3-2 分解质因数

将一个正整数分解质因数。例如:输入90,打印出

90=2*3*3*5


输入格式:

输入在一行中给出1个正整数n(n<10e9)。

输出格式:

在一行中输出n和他的因子值,如样例所示。


输入样例:

90


输出样例:

90=2*3*3*5


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
    var n = StdIn.readInt();
      var f = new Array[Int](10100)
      var j = 2
      var i = 0
      var cnt = 0;
      print(n+"=")
      for(i <- 2 to n)
      {
          if(n % j == 0)
          {
              f(cnt) = j;
              cnt += 1;
              n /= j
              j -= 1
          }
          j += 1
      }
      var t = 0
      for(p <- f if p != 0)
      {
          if(t != 0) print("*");
          if(p != 0) print(p);
          t = 1
      }
  }
}


3-3 h0161. 求最大公约数和最小公倍数

输入两个正整数a和b,求其最大公约数和最小公倍数。


输入格式:

输入在一行中给出2个不超过100000的正整数A和B。

输出格式:

在2行中输出A、B的最大公约数和最小公倍数。


输入样例:

42 36


输出样例:

最大公约数为:6
最小公倍数为:252


import scala.io.StdIn
object Main {
    def gcd(a:Int,b:Int):Int=
    {
        if(b == 0) return a;
        else return gcd(b,a%b);
    }
  def main(args: Array[String]): Unit = {
    var s = StdIn.readLine().split(' ');
      var a = s(0).toInt;
      var b = s(1).toInt;
      var g = gcd(a,b);
      println("最大公约数为:"+g);
      println("最小公倍数为:"+a * b / g);
  }
}


3-4 h0162. 字符的个数

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。


输入格式:

在一行中给出不超过1000个的字符。

输出格式:

分别输出英文字母、空格、数字和其它字符的个数


输入样例:

sghye356hf7456767632re;'wetet.';'wetye'tyye;'rw'wetry etew er


输出样例:

字母有 36 个
空格有 2 个
数字有 13 个
其他字符有 10 个


import scala.io.StdIn
object Main {
  def main(args: Array[String]): Unit = {
   var s = StdIn.readLine();
      var a = 0
      var b = 0
      var cc = 0
      var d = 0
      for(c <- s)
      {
          if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') a += 1;
          else if(c == ' ') b += 1;
          else if(c >= '0' && c <= '9') cc += 1;
          else d += 1;
      }
      println("字母有 "+a+" 个");
      println("空格有 "+b+" 个");
      println("数字有 "+cc+" 个");
      println("其他字符有 "+d+" 个");
  }
}


四:面向对象编程

4-1 设计一个矩形类Rectangle

设计一个名为Rectangle的类表示矩形。这个类包括:


两个名为width和height的double类型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1。

一个用于创建默认矩形的无参构造方法。

一个创建指定width和height值的矩形的构造方法。

一个名为getArea()的方法,返回该矩形的面积。

一个名为getPerimeter()的方法,返回周长。

编写一个测试程序,分别输入两个矩形的高和宽,创建两个Rectangle对象。按照顺序显示每个矩形的宽、高、面积和周长。


输入格式:

在一行内输入4个数据,依次为两个矩形的高和宽

输出格式:

每行输出一个矩形的宽、高、面积和周长,中间用空格隔开


输入样例:

在这里给出一组输入。例如:

4 40 3.5 35.9


输出样例:

在这里给出相应的输出。例如:

4.0 40.0 160.0 88.0
3.5 35.9 125.64999999999999 78.8


import scala.io.StdIn
class Rectangle(x : Double,y : Double)
{
  var a = x
  var b = y
  print(a)
  print(" " + b);
  def getArea(a : Double,b : Double)
  {
    var area = a * b
    print(" " + area)
  }
  def getPerimeter(a : Double,b : Double)
  {
    var C = (a + b) * 2
    println(" " + C)
  }
}
object Main {
    def main(args: Array[String]): Unit = {
    var s = StdIn.readLine().split(' ');
    var a = s(0).toDouble;
    var b = s(1).toDouble;
    var c = s(2).toDouble;
    var d = s(3).toDouble;
    var rest1 = new Rectangle(a,b);
    rest1.getArea(a,b);
    rest1.getPerimeter(a,b);
    var rest2 = new Rectangle(c,d);
    rest2.getArea(c,d);
    rest2.getPerimeter(c,d);
  }
}


4-2 定义一个类表示圆(Circle)

定义一个类表示圆(Circle),成员变量r表示圆的半径,成员方法printArea( )用于输出圆的面积。


定义测试类Main,在它的main方法中定义两个Circle类的对象c1、c2,从键盘输入两个数据分别作为c1和c2的半径,并分别调用它们的printArea( )方法输出其面积。


(提示:使用Math.PI表示圆周率,使用Scanner类进行输入,使用printf函数保留小数点后两位。)


输入格式:

输入两个数据分别作为圆c1和c2的半径,中间以空格隔开。

输出格式:

按两行分别输出圆c1和c2的面积,保留小数点后两位。


输入样例:

在这里给出一组输入。例如:

3  7.2


输出样例:

在这里给出相应的输出。例如:

28.27
162.86


import scala.io.StdIn
class Circle(x : Double)
{
  var r = x;
  def getArea(r : Double)
  {
    printf("%.2f\n",Math.PI * r * r)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    var s = StdIn.readLine().split("  ");
    var r1 = s(0).toDouble;
    var r2 = s(1).toDouble;
    var cir1 = new Circle(r1);
    cir1.getArea(r1);
    var cir2 = new Circle(r2);
    cir2.getArea(r2);
  }
}


目录
相关文章
|
2月前
|
消息中间件 存储 druid
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
47 3
|
7月前
|
消息中间件 分布式计算 Java
Scala函数式编程【从基础到高级】
Scala函数式编程【从基础到高级】
|
5月前
|
存储 监控 BI
上网行为管理软件中的Scala函数式编程
**使用Scala进行上网行为管理**\n本文探讨了如何利用Scala的函数式编程特性来监控和管理上网行为。示例中,定义了`WebActivity`案例类来存储数据,通过集合操作如`filter`, `map`和`foldLeft`处理数据,统计用户访问次数和活动。此外,还展示了如何使用HTTP库自动提交数据到网站。Scala的这种方法提高了数据处理效率,确保一致性和安全性。
62 0
|
7月前
|
人工智能 安全 人机交互
Scala 05 —— 函数式编程底层逻辑
Scala讲座探讨了函数式编程的底层逻辑,强调无副作用和确定性。函数式编程的核心是纯函数,避免读写数据等副作用,将其移至代码边缘处理。函数输入输出应清晰定义,避免模糊参数。函数视为数据范畴间的映射,以范畴论为基础。业务逻辑转化为纯函数式,通过声明式编程实现解耦,关注输入输出而非过程,便于验证和自动编程。将业务逻辑视作流水线,每个函数处理数据,避免全局变量和`var`,优先确保正确性再优化效率。
53 1
Scala 05 —— 函数式编程底层逻辑
|
7月前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
104 2
|
7月前
|
数据采集 监控 安全
通过Scala实现局域网监控上网记录分析:函数式编程的优雅之路
在当今数字时代,网络监控成为保障信息安全的必要手段之一。本文将介绍如何使用Scala编程语言实现局域网监控上网记录分析的功能,重点探讨函数式编程的优雅之路。通过一系列代码示例,我们将展示如何利用Scala的函数式特性和强大的语法来实现高效的监控和分析系统。
256 1
|
数据采集 XML 编译器
Scala爬虫实战:采集网易云音乐热门歌单数据
Scala爬虫实战:采集网易云音乐热门歌单数据
|
分布式计算 API Scala
Scala函数式编程
Scala函数式编程
72 0
|
分布式计算 Ubuntu Java
|
大数据 编译器 Scala
大数据开发基础的编程语言的Scala的函数式编程范式
Scala是一种支持函数式编程范式的编程语言,它允许开发者使用函数和不可变数据结构来实现程序逻辑。本文将介绍Scala中函数式编程范式的概念和用法,帮助开发者更好地理解和应用这门语言。
110 0