使用Scala练习java经典习题之循环+数组

1.百钱买百鸡

package com.sunyong

object Baiqianji {
  def main(args: Array[String]): Unit = {
    var count=0
    for(i<-0 to 20){
      for (j <-0 to 33){
        for (k <- 0 to 100){
          if(i+k+j==100 && i*15+j*9+k==300){
            count+=1
            println("公鸡:" + i + "只," + "母鸡:" + j + "只," + "小鸡:" + k + "只")
          }
        }
      }
    }
    println("总共有" + count + "中购买方式!")
  }
}

2.鸡兔同笼。

package com.sunyong
//鸡兔同笼。鸡兔一共有50只,脚一共有160只,问鸡和兔各多少只?要求鸡兔至少一样一只
object JiTu {
  def main(args: Array[String]): Unit = {
    //鸡两只脚  兔子四只脚   一起50只 160只脚
    var count=0
    for (i<-0 to 50){
      for (j<-0 to 50){
        if(i+j==50 && i*2+j*4==160){
          count+=1
          println("鸡:" + i + "只," + "兔子:" + j + "只")
        }
      }
    }
    println("总共有" + count + "种方式!")
  }
}

3.公鸡2文母鸡1文小鸡半文每种至少一只100文买100只鸡有多少种可能

package com.sunyong
//公鸡2文,母鸡1文,小鸡半文,每种至少一只,100文买100只鸡有多少种可能
object Ji {
  def main(args: Array[String]): Unit = {
    var count = 0
    for (i<-1 to 50){
      for(j<-1 to 100){
        for(k<- 1 to 200){
          if (i+k+j==100 && i*4+j*2+k==200) { //注意不能直接k/3 /符号是取商
            count += 1
         println("公鸡:" + i + "只," + "母鸡:" + j + "只," + "小鸡:" + k + "只")
          }
        }
      }
    }
    println ("总共有" + count + "中购买方式!")
  }
}

4.请输入一个正整数年份,判断是否是闰年?

package com.sunyong

import java.util.Calendar

import scala.io.StdIn

object runnian {
  def main(args: Array[String]): Unit = {
    val calendar = Calendar.getInstance()
    println("请输入一个正整数:")
    var year = StdIn.readInt()
    //判断2月份有多少天
    //设置时间为2月27号 月份0-11
    calendar.set(year,1,27)
    //加2天为 可能 2月份29  3月 1
    calendar.add(Calendar.DAY_OF_MONTH,2)
    if(calendar.get(Calendar.DAY_OF_MONTH)==29){
      println(year+"年是闰年")
    }else{
      println(year+"年不是闰年")
    }
  }
}

5.随机生成一个int型一维数组,从控制台输入一个数值,遍历数组查找,如果找到了,打印出该数在数组中的位置,如果没有查到,请将该数值插入并形成新的数组(要求降序)

package com.sunyong

import scala.io.StdIn

/*
* 随机生成一个int型一维数组,从控制台输入一个数值,遍历数组查找,
* 如果找到了,打印出该数在数组中的位置,
* 如果没有查到,请将该数值插入并形成新的数组(要求降序)
* */
object shuzu {
  def main(args: Array[String]): Unit = {
    var arr = new Array[Int]((math.random*10+1).toInt)
    for (i <- 0 until arr.length) {
      arr(i)= (math.random*20).toInt
    }
    println(arr.mkString(","))
    println("输入一个整数:")
    val a = StdIn.readInt()
    val index = arr.indexOf(a)
    if(index>=0){
      println(index)
    }else{
      var b = new Array[Int](arr.length+1)
      arr.copyToArray(b)
      b(b.length-1)=a
      println(b.sorted.reverse.mkString(","))
    }

  }
}

6.数学黑洞6174

package com.sunyong

import scala.io.StdIn

/*
 * 已知:一个任意的四位正整数。将数字重新组合成一个最大的数和最小的数相减,
 * 重复这个过程,最多七步,必得6174。  -->将减后的值继续重新拆分
 * 即:7641-1467=6174。将永远出不来。
 * 求证:所有四位数数字(全相同的除外),均能得到6174。输出掉进黑洞的步数。
 */
object MathBlackHole {
  def main(args: Array[String]): Unit = {
    var flag = true
    while (flag){
      var maxNum=0
      var minNum=0
      var count=0
      print("请输入一个四位正整数:")
      var num = StdIn.readInt()
      println(num)
      while(num / 1000 == num % 10 && num / 1000 == num % 1000 / 100 && num / 1000 == num % 100 / 10){
        print("数字不可全部一样,请输入一个四位正整数:")
        num = StdIn.readInt()
      }
      do {
        var nums =new Array[Int](4)
        nums(0)=num/1000
        nums(1)=num%10
        nums(2)=num%1000/100
        nums(3)=num%100/10
        nums=nums.sorted
        maxNum=nums(3)*1000+nums(2)*100+nums(1)*10+nums(0)
        println("第" + (count + 1) + "次重新组合最大的值:" + maxNum)
        minNum=nums(0)*1000+nums(1)*100+nums(2)*10+nums(3)
        println("第" + (count + 1) + "次重新组合最小的值:" + minNum)
        num=maxNum-minNum
        println("差值:"+num)
        count+=1
      }while(num!=6174)
      println("总共输入了:" + count + "次")
      if(count>7){
        println("超过了7次")
        flag=false
      }
    }
    println("程序退出")
  }
}

7.有一组数,其排列形式如下:11,19,9,12,5,20,1,18,4,16,6,10,15,2,17,3,14,7,13,8,且尾部8和头部11首尾相连,构成环形的一组数,编程找出相邻的4个数,其相加之和最大,并给出它们的起始位置下标。

package com.sunyong
/*
* 有一组数,其排列形式如下:
* 11,19,9,12,5,20,1,18,4,16,6,10,15,2,17,3,14,7,13,8,
* 且尾部8和头部11首尾相连,构成环形的一组数,
* 编程找出(连续)相邻的4个数,其相加之和最大,并给出它们的起始位置下标。
* */

object huanxing {
  def main(args: Array[String]): Unit = {
    var arr = Array[Int](11,19,9,12,5,20,1,18,4,16,6,10,15,2,17,3,14,7,13,8)
    var max1=0
    var index1 = 0
    for (i <- 0 until arr.length-5){
     var a = arr(i)+arr(i+1)+arr(i+2)+arr(3)
      if(max1< a){
        max1=a
        index1=i
      }
    }
    //留下左边三个数
    var b = arr.dropRight(arr.length-3)
    //留下右边三个数
    var c = arr.drop(arr.length-3)
    //重新组合成新数组
    var d = c++:b //右边三个 + 左边三个
//    println(d.mkString(","))
    var index2=0
    var max2=0
    for (i <- 0 until d.length-5){
      var a = d(i)+d(i+1)+d(i+2)+d(3)
      if(max2< a){
        max2=a
        index2 = i
      }
    }
    //判断是原本数组的下标还是组成环形之后的和更大
    if (max1>=max2){
      println("起始下标:"+index1+",最大值:"+max1)
    }else{
      println("起始下标"+(index2+arr.length-3)+",最大值:"+max2)
    }
  }
}

8.输入一个十进制数,将其转换成二进制数

package com.sunyong

import scala.io.StdIn

//输入一个十进制数,将其转换成二进制数
//除2取余,逆序排列
object erjinzhi {
  def main(args: Array[String]): Unit = {
    println("请输入一个正整数:")
    val num = StdIn.readInt()
      var shang = num
      var r = 0
      var res = ""//保存余数
      while (shang!=0){
        r=shang % 2
        res = r+res //取余逆排列
        shang /=2
    }
    println(num+"转换二进制为:"+res)
  }
}

9.利用for循环生成由A-Z26个大写字母与a-z26个小写字母组成的数组

package com.sunyong
//利用for循环生成由ABCDEFG...XYZ,26个大写字母与26个小写字母组成的数组
object str {
  def main(args: Array[String]): Unit = {
    var a1 = 'A'
    var arr1 = new Array[Char](26)
    for (i <- 0 to 25){
      arr1(i)=(a1.toByte.toInt+i).toChar
    }
    var a2 = 'a'
    var arr2 = new Array[Char](26)
    for (i <- 0 to 25){
      arr2(i)=(a2.toByte.toInt+i).toChar
    }
    var arr3 = arr1++:arr2
    println(arr3.mkString(","))
  }
}

10.控制台输入一行字符串,简单实现一个wordcount词频统计

package com.sunyong

import scala.io.StdIn

object worlCount {
  def main(args: Array[String]): Unit = {
    println("请输入一个句子:")
    val str = StdIn.readLine()
    println(str.split(" ").map((_,1)).groupBy(_._1).map(x =>(x._1,x._2.length)))
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值