Java的练习题

发布于:2023-01-21 ⋅ 阅读:(141) ⋅ 点赞:(0)

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 + "不是素数");
        }
    }

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 到 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 到 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

  • 题解:
    二进制的位数一共是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);
    }

答案: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);
    }

结果: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);
    }

结果: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);
    }
  • 题解:
    方法二是通过方法一进行优化
    由于负负得正,我们可以巧妙的通过这个方法达成想要的结果

水仙花数

求出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);
        }
    }
}
  • 题解:
    第一步:要先计算它是几位数,定义一个计数器,之和就是模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();
        }
    }
}
  • 题解:
    输出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--;
    }
}
  • 题解:
    这题很简单,难点在于字符串的对比
    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) + " ");
    }
}
  • 题解:
    二进制是32位,使用 按位于 & 个 1 就可以得出二进制位上的数字
    主要的是循环条件,应该是从最高位往下,每循环一次是 i -= 2
    输出计算的值就可以了

网站公告

今日签到

点亮在社区的每一天
去签到