A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

zonekok

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© zonekok 初级黑马   /  2019-6-26 09:33  /  735 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

来黑马有一段日子了,下面将我学习过程中遇到的难点与大家分享
/*
需求:键盘输入两个数。定义方法求出这两个数的最小公倍数和最大公约数。
*/
public class MaxAndMin {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个数:");
        int a = sc.nextInt();
        System.out.println("请输入第二个数:");
        int b = sc.nextInt();
        int gongBeiShu = minGongBeiShu(a, b);
        System.out.println("最小公倍数是:" + gongBeiShu);
        int gongYueShu = maxGongYueShu(a, b);
        System.out.println("最大公约数是:" + gongYueShu);
    }

    public static int minGongBeiShu(int a, int b) {
        int max = a > b ? a : b;
        int min = a < b ? a : b;
        for (int i = max; i <= min * max; i++) {
            if (i % a == 0 && i % b == 0) {
                return i;
            }
        }
        return -1;
    }

    public static int maxGongYueShu(int a, int b) {
        int max = a > b ? a : b;
        int min = a < b ? a : b;

        for (int i = min; i > 1; i--) {
            if (max % i == 0 && min % i == 0) {
                return i;
            }
        }
        return -1;
    }
}
求两个数的最大公约数和最小公倍数有异曲同工之处,主要是讲循环的起点和终点分析清楚,这样才能提高效率。

/*
需求:给定一个整数数组array和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

*/
public class GetSum {

    public static void main(String[] args) {
        int[] array = {15, 25, 37, 48, 55, 73, 837, 82, 21};//定义一个数组
        Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个数");
            int target = sc.nextInt();//自己手动输入一个目标
            boolean flag = false;// 定义一个布尔类型标记,用来标记数据不存在情况
            for (int i = 0; i < array.length; i++) {//第一层循环,用来控制数组中的所有元素
                for (int j = i + 1; j < array.length; j++) {// 第二层循环,因为不能重复使用数组中的元素,所以j从i+1开始
                    if ((array[i] + array[j]) == target) {// 如果发现
                        System.out.println("数组下标是:" + i + "和" + j);
                        flag = true;
                        break;
                    }
                }
            }
            if (!flag)
                System.out.println("不存在");
            }
    }
这道题的重点就是嵌套循环,第一个循环用来遍历数组中的所有元素,第二层循环因为题干要求不能重复利用数组中同样的元素,所以第二层循环的起点是i+1;

/*
需求:一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
*/
public class Demo8 {
    public static void main(String[] args) {
        //1.定义存放奖金的数组
        int[] arr = {10000,1000,588,888,2};
        //2.定义数组存放已经被取过的奖金
        int[] brr = new int[5];
        //3.定义变量表示brr的索引
        int index = 0;
        //4.创建随机数对象
        Random r = new Random();
        //5.定义循环反复获取随机数,如果index小于arr的长度则继续循环
        while(index < arr.length){
            //5.1每次生成一个随机索引对应一个奖金
            int i = r.nextInt(arr.length);
            //5.2调用方法判断这个奖金是否被获取过
            boolean b = exist(brr, arr[i]);
            //5.3b是false代表这个奖金没有被抽取过
            if(!b) {
                //5.4把获取之后的奖金存放到brr中
                brr[index] = arr[i];
                //5.5index索引向后移动一次
                index++;
                //5.6打印本次被抽出的奖项
                System.out.println( arr[i] + "元的奖金被抽出");
            }
        }
    }
    //6.定义方法:判断brr数组中是否存在num这个数字
    public static boolean exist(int[] brr,int num){
        //6.1对数组进行遍历
        for (int i = 0; i < brr.length; i++) {
            //6.2判断如果找到数字,则返回true
            if(brr[i] == num){
                return true;
            }
        }
        //6.3如果最终没有找到则返回false
        return false;
    }
}
这一道题的难点是抽奖的时候要随机而且不能重复,这就需要我们重新定义一个数组,将已经抽过的奖项放入新数组中,这样当随机出一个奖项时,做出判断,遍历新数组,看奖项是否被抽过,

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马