一些简单训练题

目录

前言

1.飞机票计算

2.成绩等级判定

3.循环嵌套的联系

 4.随机数的训练

 5.哥德巴赫猜想

 6.编写程序,将一个整数倒排过来

 7.求50000以内的完备数

8.求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4

9. 斐波那契数列

10.百元买百鸡

11.猴子吃桃

总结


前言

        这是今天作者做的一些训练题,在此记录一下。


1.飞机票计算

 /** 
  需求:飞机票在淡季是有优惠政策的,而放假期间是没有优惠的,
  假设在元旦三天(1.01---1.03),
  五一三天(5.01---5.03),
  十一七天(10.01---10.07)无任何优惠,
  除了以上13天,都打8折, 请输入您哪天订票,以及票价(自己设定一个吧),
  输出应付多少钱?
 */

        从描述上可以看出,这是需要分区间进行运算的题目,可以用if进行操作,很简单的区间运行。

实现代码如下:

public class Test_01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int price = 400;    //      票价设置为400元
//      元旦三天票价打六折,五一三天打七折,十一七天无优惠,除了这几天全部打八折
        System.out.println("请输入您要买票的日期(以小数的形式输入,例如:五月三日请输入5.30):");
        double data = sc.nextDouble();
        if (data >= 1.01 && data <= 1.03) {
            System.out.println("票原价为400元,您的票价可以打六折,票价为:" + price * 0.6);
        } else if (data >= 5.01 && data <= 5.03) {
            System.out.println("票原价为400元,您的票价可以打七折,票价为:" + price * 0.7);
        } else if (data >= 10.01 && data <= 10.07) {
            System.out.println("您的票价为:" + price);
        } else if (data >= 12.31 || data <= 1.01) {
            System.out.println("您输入的日期不存在,请重新输入!!!");
        } else {
            System.out.println("票原价为400元,您的票价可以打八折,票价为:" + price * 0.8);
        }
    }
}

         从代码可以看出,有一种情况没有考虑,那就是一个月只有30天,但是因为使用小数代替日期,小数部分可以超过30天,这种情况没有进行判断,这是一个没考虑到的地方。

2.成绩等级判定

/**
  输入学员的考试成绩,输出这学员考试成绩的级别。
    100      A级
    90~99    A级
    80~89    B级
    70~79    C级
    60~69    D级
    < 60     不合格
*/

 

        从描述上可以看出,这是需要分区间进行运算的题目,可以用if或者switch进行操作,本文选择使用switch进行实现。但是其实有些繁琐,没有足够简洁,这是一大败笔。因此我的实现是一个反面案例。

实现代码如下:

public class Test_02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char grade = 'E';
        System.out.println("请输入您的分数:");
        int score = sc.nextInt();
        if (score > 100 || score < 0) {
            System.out.println("您的成绩不存在,请重新输入!");
            grade = 'F';
        } else if (score >= 90) {
            grade = 'A';
        } else if (score >= 80) {
            grade = 'B';
        } else if (score >= 70) {
            grade = 'C';
        } else if (score >= 60) {
            grade = 'D';
        }
        switch (grade){
            case 'A':
                System.out.println("您的成绩等级为:A");
                break;
            case 'B':
                System.out.println("您的成绩等级为:B");
                break;
            case 'C':
                System.out.println("您的成绩等级为:C");
                break;
            case 'D':
                System.out.println("您的成绩等级为:D");
                break;
            case 'E':
                System.out.println("您的成绩不合格!");
                break;
        }
    }

         从代码可以看出,即使用了if又使用了switch。代码过于臃肿,在此做一个反面教材。

3.循环嵌套的联系

//练习1:打印出n行金字塔,字母版
    *
   ***
  *****
 ******* 
 
    A
   BBB
  CCCCC
 DDDDDDD

 参考代码如下:

public class Demo_01 {
    public static void main(String[] args) {
        int n=0; //输入的行数
        int r=0; //当前行
        int s=0; //的数量
        int p=0; //空格的数量

        System.out.println("请输入您想要生成的行数:");
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();

        for(r=1;r<=n;r++){
            //打印空格
            for(p=1;p<=n-r;p++){
                System.out.print(" ");
            }
            //打印
            for(s=1;s<=2*r-1;s++){
                char c = ('*');
                System.out.print(c);
            }
            //行换
            System.out.print("\n");
        }

        int r_1 = 0; //当前行
        int s_1 = 0; //的数量
        int p_1 = 0; //空格的数量


        for(r_1 = 1; r_1 <=n ; r_1++){
            //打印空格
            for(p_1 = 1; p_1 <= n - r_1; p_1++){
                System.out.print(" ");
            }
            //打印
            for(s_1 = 1; s_1 <= 2 * r_1 - 1; s_1++){
                char c = (char)('A' + (r_1-1));
                System.out.print(c);
            }
            //行换
            System.out.print("\n");
        }
    }
}

         金字塔的创建,使用循环分别记录空格数和打印的符号数,同时输出,找出每层个数的规律,就可以写出。

//练习2:乘法口诀表
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
.....

 参考代码如下:

public class Demo_02 {
    public static void main(String[] args) {
        int row = 9;
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.printf("%d*%d=%2d\t", j, i, i * j);
            }
            System.out.print("\n");
        }
    }
}

         乘法口诀表,与金字塔的生成有些类似,只是不需要记录空格数量,只需要从最初位置输出即可。

//练习3:for循环实现在控制台打印水仙花数,并统计水仙花的个数
/*
    分析:
        什么是水仙花数呢?
        所谓的水仙花数是指一个三位数[100,999],其各位数字的立方和等于该数本身。
        举例:153就是一个水仙花数。
        153 = 1*1*1 + 5*5*5 + 3*3*3
 */

 参考代码如下:

public class Demo_03 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 100; i < 999; i++) {
            int sum = (i / 100) * (i / 100) * (i / 100) + ((i / 10)%10) * ((i / 10)%10) * ((i / 10)%10) + (i % 10) * (i % 10) * (i % 10);
            if (sum == i) {
                count++;
                System.out.println(sum);
            }
        }
        System.out.println("水仙花数的个数为:" + count);
    }
}

         水仙花数,按照公式将个位数、十位数、百位数分别运算即可。

//练习4:有口井7米深,一只青蛙白天爬3米,晚上坠下2米,问这青蛙几天才能爬出这口井(while)

 参考代码如下:

public class Demo_04 {
    public static void main(String[] args) {
        int m = 7;
        int high = 0;
        int up_high =3;
        int down_high = 2;
        int count = 0;
        while (true){
            count ++;
            if (high + count * up_high >= m){
                break;
            }
            high -= down_high;
        }
        System.out.println("这只青蛙爬出井的天数为:" + count);
    }
}

        上面几个案例都是很经典的循环控制案例,可以思考一下。

 4.随机数的训练

/**
    猜数字的游戏(GuessNumber)
    游戏运行时产生一个1-100之间的随机整数,要求用户从控制台输入数字,
    若输入的数字比产生的数字小,则输出:“太小了,再大一点!”;
    若输入的数字比产生的数字大,则输出:“太大了,再小一点!”,
    若输入的数字和产生的数字相等,则输出:“恭喜你猜对了!”,break
    若用户猜了7次还未猜对,则输出:“你太笨了,下次再来吧!”,然后退出程序。
    提示:
        (1)、int num=(int)(Math.random()*100); //java.lang.Math;
        (2)、Scanner in=new Scanner(System.in); // java.util.Scanner;
             int n = in.nextInt();
*/

参考代码如下:

public class Test_04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num=(int)(Math.random()*100); //java.lang.Math;
        int count = 0;
        while (true){
            System.out.println("请输入一个1-100之间的两位数:");
            int number = sc.nextInt();
            count++;
            if (count == 7){
                System.out.println("你太笨了,下次再来吧!");
                break;
            }
            if (number > num){
                System.out.println("您输入的数大于产生的数,请重新输入");
                continue;
            } else if (number < num) {
                System.out.println("您输入的数小于产生的数,请重新输入");
                continue;
            }

            if (number == num){
                System.out.println("恭喜你猜对了!");
                break;
            }

        }

    }
}

使用随机数生成之后,将输入的数依次比较之后,给出提示,就可以做出,一步一步来即可。

 5.哥德巴赫猜想

输入的是0,表示想退出输入;
对任何一个不小于6的偶数a,总可以表示成两个奇素数的和;a= x+y;
   8 = 3 + 5;
奇素数:奇数,素数:只能被1或者本身整除的数(质数)

参考代码如下:

public class Test_01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (true) {
            int m = 0;
            System.out.println("请输入一个大于6的偶数(输入0时结束输出):");
            int number = sc.nextInt();
            if (number == 0){
                System.out.println("输出结束!");
                break;
            }
            if (number <= 6){
                System.out.println("您输入的数字没有大于6,请重新输入!");
            }
            if (number % 2 != 0){
                System.out.println("您输入的数不是偶数,请重新输入!");
            }
            int[] arr = new int[number];
            for (int i = 0; i < number; i++) {
                for (int j = 2; j < i; j++) {
                    if (i % j == 0){
                        break;
                    }
                    arr[m] = i;
                    m++;
                    break;
                }
            }

            for (int i = 0; i < arr.length-1; i++) {
                for (int j = i+1; j < arr.length - 2; j++) {
                    if (arr[i] + arr[j] == number) {
                        System.out.println("成功证明!");
                        System.out.println(arr[i] + "+" + arr[j] + "=" + (arr[i] +arr[j]));
                    }
                }
            }
        }
    }
}

         使用数组记录输入的偶数的从3到偶数本身之间的奇素数,然后遍历数组看数组中的数能否有两个数和为输入的偶数。

 6.编写程序,将一个整数倒排过来

例如:给定整数:49082000,得到的结果:28094。

参考代码如下:

public class Test_02 {
    public static void main(String[] args) {
        int number = 49082000;
        String str = String.valueOf(number);
        String result = "";
//        System.out.println(str.substring(8, 9));
        for (int i = str.length()-1; i >= 0; i--) {
            result += str.substring(i , i + 1);
        }
        Integer number2 = Integer.valueOf(result);
        System.out.println("反转后的整数为:" + number2);
    }

}

        将整数转换成字符串,使用字符串拼接将字符串顺序颠倒,再将反转之后的字符串转为整数,就可以进行数字反转,由于反转之后的为整数,整数前面的0在输出时不会被记录,所以就可以消除数字前面的0.

 7.求50000以内的完备数

提示:完备数--->它的约数(除了它本身)之和等于自己;
如:6的约数有1,2,3,1+2+3 = 6;

 参考代码如下:

public class Test_03 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int number = sc.nextInt();
        int sum = 0;
        for (int j = 1; j < number; j++) {
            if (number % j == 0){
                sum = sum + j;
            }
        }

        if (sum == number){
            System.out.println("您输入的数是一个完备数!");
        }else {
            System.out.println("您输入的数不是一个完备数。");
        }
    }
}

         与哥德巴赫猜想相似的解决步骤。

8.求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4

求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4

 参考代码如下:

public class Test_04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您想要计算到的位数:");
        long num = sc.nextInt();
        double sum = 0.0;
        for (int i = 1; i <= num; i++) {
            sum += (((double) 1 /(2 * i - 1)) * Math.pow( -1, i + 1));
        }
        System.out.println("结果为:" + 4 * sum);
    }
}

9. 斐波那契数列

1 1 2 3 5 8 13 21 34 55 ...

参考代码:

public class Test_05 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您想要计算到的位数(位数应该大于2):");
        int num = sc.nextInt();
        int[] arr = new int[num];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i <= num - 1; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        System.out.println("输出的斐波那契数列为:");
        for (int i = 0; i < num; i++) {
            System.out.print(arr[i] + "\t");
        }

    }
}

 这是使用数组记录斐波那契数列的值,输出时直接遍历数组。

10.百元买百鸡

一百元钱买百鸡,公鸡每只五元整,每只母鸡是三元;
小鸡因小价钱低,三只小鸡是一元;公鸡母鸡和小鸡,请你算出各是几?

参考代码如下:

public class Test_06 {
    public static void main(String[] args) {

//        int cock = 0;      //公鸡数量
//        int hen = 0;       //母鸡数量
//        int poult = 0;     //小鸡数量

        for (int cock = 0; cock < 20 ; cock++) {
            for (int hen = 0; hen < 30 ; hen++) {
                for (int poult = 0; poult < 300 ; poult +=3) {
                    if (cock + hen + poult == 100 & 5 * cock + 3 * hen + (poult / 3) * 1 <= 100) {
                        System.out.println("公鸡个数为:" + cock +",母鸡个数为:" + hen +",小鸡个数为:" +poult);
                    }
                }
            }
        }
    }
}

 这段代码感觉可能不一定正确,使用循环遍历三个数,使用条件作为结束的判断。

11.猴子吃桃

猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个。
第二天又将剩下的桃子吃掉一半,又多吃了一个。
以后每天都吃前一天剩下的一半零一个。
到第10天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?

参考代码如下:

public class Test_07 {
    public static void main(String[] args) {

        int num = 1;          //第十天桃子数
        int sum = 0;          //第一天桃子数

        for (int i = 1; i < 10; i++) {
            sum = (num +1) * 2;
            num = sum;
        }

        System.out.println("第一天桃子数为:" + sum);

    }
}

总结

        这是作者今天写的一些练习题,进行分享。如果有错误的地方,还希望可以指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值