• Java的练习题


    Java的练习题

    这是Java 中简单的练习题,通过练习去熟悉语法

    判定素数

    输出一个数,判断它是否是素数

    什么是素数?

    质数又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)

    • 第一种方法:
      暴力求解
    public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int x = 0;
            for (int i = 2; i < n; i++) {
                if(n % i == 0) {
                    x = 1;
                    break;
                }
            }
            if(x == 0) {
                System.out.println(n + "是素数");
            }
            else {
                System.out.println(n + "不是素数");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Scanner 是Java 中输入的类,Scanner类可以生成一个解析基本类型和字符串的文本扫描仪
    我们可以通过 Scanner 类来获取从键盘中输入的数值

    • 题解:
      判断它是否是素数,我们可以同过循环的方式历遍从 2 到 n-1 之间的数字
      如果 2 到 n-1 之间的数字 能被 i 整除,那么就不是素数
      如果不能,结果就是素数

    输出 1000 - 2000 之间所有的闰年

    闰年的定义是能被 4 整除并且不能被 100 整除,或者是能被 400 整除的数

    public static void main(String[] args) {
            for (int i =1000; i <= 2000;i++) {
                if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
                    System.out.println(i);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 题解:
      直接安照闰年定义的条件进行判断就可以了,很简单

    1 到 100 的所有整数中出现多少个数字9

    判断1 到 100 的数字中出现 9 的次数,99 是算 2 个

    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 100; i++) {
            if(i % 10 == 9) {//判断个位的9 
                count++;
            }
            if(i/10 == 9) {
                count++;//判断十位的9
            }
        }
        System.out.println(count);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 题解:
      首先是历遍出 1 到 100 的数字,判断条件个位的是 % 10 是否余数是 9,十位是除的余数是否是 9

    二进制1的个数

    求一个整数,在内存当中存储时,二进制1的个数

    方法一:
    暴力求解

     public static void main1(String[] args) {
            int n = 4;
            int sum = 0;
            for (int i = 0; i < 32; i++) {
                if (((n >> i) & 1) != 0) {
                    sum++;
                }
            }
            System.out.println(sum);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    答案:1

    • 题解:
      二进制的位数一共是32位,循环然后和 逻辑与& 1,看判断条件是否为真,为真计数器+1
      在这里插入图片描述
      方法二:
      这种方法是使用 Java 种的无符号右移 >>>
    public static void main(String[] args) {
            int n = 5;
            int count = 0;
            while(n != 0) {
                if( (n & 1) != 0) {
                    count++;
                }
                n = n >>> 1;
            }
            System.out.println(count);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    答案:2

    • 题解:
      无符号右移 >>> 是无论正负数,右移的是补0,利用无符号右移 >>> 的特性,用while进行循环判断
      和第一种方法类似

    方法三:
    效率最高

    public static void main(String[] args) {
            int n = 7;
            int count = 0;
            while(n != 0) {
                n = n & (n-1);
                count++;
            }
            System.out.println(count);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果:3

    • 题解:
      每次让 n & n-1 的数字,二进制就会少一个1
      只要计算 & 了几次就行
      在这里插入图片描述

    计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值

    这要找规律,一除于的数是每次往上递增的,奇数的是加,偶数的是减
    方法一:

    public static void main2(String[] args) {
            double sum = 0;
            for (int i = 1; i <= 100; i++) {
                if(i % 2 == 1) {
                    sum += 1.0 / i;
                }
                else {
                    sum -= 1.0 / i;
                }
            }
            System.out.println(sum);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果:0.688172179310195

    • 题解:
      之前讲过奇数的是加,偶数的是减
      那么我们可以加个判断,单独的进行计算,再用一个数加起来

    方法二:

    public static void main(String[] args) {
            double sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum += 1.0/i;
                sum = -sum;
            }
            System.out.println(sum);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 题解:
      方法二是通过方法一进行优化
      由于负负得正,我们可以巧妙的通过这个方法达成想要的结果

    水仙花数

    求出0~n之间的所有“水仙花数”并输出
    “水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=13+53+3^3,则153是一个“水仙花数

    public static void main(String[] args) {
        for (int i = 1; i <= 999; i++) {
            int x = i;
            int sum = 0;
            int count = 0;
            while(x != 0) {
                x /= 10;
                count++;
            }
            x = i;
            while(x != 0) {
                sum += Math.pow(x%10,count);
                x /= 10;
            }
            if(sum == i) {
                System.out.println(i);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 题解:
      第一步:要先计算它是几位数,定义一个计数器,之和就是模10再除10,计算出 i 的位数
      在这里插入图片描述
      第二步:求出每位数的次方,用一个变量加起来
      Math.pow 是Java 里用来求次方的
      第一个参数: 输你要求什么数的次方
      第二个参数:求几次方
      最后就是判断所有位数加起来的次方之和 是否等于 i

    输出乘法口诀表

    输出n*n的乘法口诀表,n由用户输入

    import java.util.Scanner;
    public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= i; j++) {
                    System.out.print(i + "*" + j + "="+ j*i + " ");
                }
                System.out.println();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 题解:
      输出n*n的乘法口诀表,n由于用户输入的
      所以需要使用 Scanner ,类型是nextInt
      还有最后就是格式需要注意一下

    模拟登陆

    编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 3;
        while (count != 0) {
            System.out.println("请输入密码,共有" + count + "次机会");
            String pd = scan.nextLine();
            if(pd.equals("123")) {
                System.out.println("登陆成功");
                break;
            }
            else {
                System.out.println("登陆失败");
            }
            count--;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 题解:
      这题很简单,难点在于字符串的对比
      Java 的字符串对比是使用 equals
      使用方法:变量名.equals

    二进制序列

    获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列

    public static void main(String[] args) {
        int n = 7;
        for (int i = 31; i >= 1; i -= 2) {
            System.out.print( ((n >> i) & 1) + " ");
        }
        System.out.println();
        for (int i = 30; i >= 0; i -= 2) {
            System.out.print(((n >> i) & 1) + " ");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 题解:
      二进制是32位,使用 按位于 & 个 1 就可以得出二进制位上的数字
      主要的是循环条件,应该是从最高位往下,每循环一次是 i -= 2
      输出计算的值就可以了
  • 相关阅读:
    使用todesk或者向日葵远程Ubuntu22.04系统的客户机黑屏
    任务提醒摆件HTTP服务器端功能解析
    【1. MySQL锁机制】
    企企通亮相广东智能装备产业发展大会:以数字化采购促进智能装备产业集群高质量发展
    IDM的实用功能介绍+下载地址
    医学YOLOv8 | 脑肿瘤检测 Accuracy 99%
    探索随机森林: 机器学习中的集成学习神器
    Pandas学习记录
    SpringCloud无介绍快使用,sentinel注解@SentinelResource的基本使用(二十三)
    Java自动化测试调试中遇到的问题
  • 原文地址:https://blog.csdn.net/m0_66483195/article/details/126258823