Java基础50道经典练习

基础问答15题

1. 【基本概念问答】请问Java语言是跨平台的吗?JVM是跨平台的吗?为什么?

答:

Java语言是跨平台的,JVM不是跨平台的
不同平台需要安装对应版本的JVM才能运行(例如:windows系统有windows版的JVM,linux系统有linux体统的
JVM)所以说JVM是不能跨平台的。
Java语言通过不同系统上的JVM(相当于一个桥梁)对Java语言进行编译和运行,所以说java是跨平台的,而JVM
就是Java语言跨平台的关键

2.【环境变量配置问答】为什么要配置Java环境变量?不配置环境变量可不可以命令行编译执行Java代码?请尝试配置环境变量,达到在命令行(cmd)窗口输入qq命令就能启动qq的效果。(效果截图)

答:

为了在CMD的任意目录下,都可以启动某一个软件,

在启动软件的时候,操作系统会先在当前路径下找,如果在当前录课没有,再到环境变量的路径中去找。如果都找不到就提示无法启动。

后缀名为.java的源文件并不能被执行,它需要被编译成.class的二进制字节码文件,需要用到JDK当中提供的编译程序,一个名字叫做javac后缀为.exe的可执行文件,它存在于JDK安装路径下的bin文件夹中。但是.java源文件文件有可能会被保存到磁盘上任何一个文件夹中。当我们在源文件所在的文件夹中去调用javac编译程序,系统会找不到这个它,因为java源文件与编译程序根本不在同一个文件夹。

不配置环境变量的话只能是.java源文件和javac编译程序在同一个文件夹目录下。
在这里插入图片描述

3.【命令行编程】新建一个Java文件, 然后手写Hello World程序。(要求记事本完成,该题目提交 Helloworld程序的代码及命令行cmd运行截图即可

在这里插入图片描述

在这里插入图片描述

4.【进制转换】将67转换为二进制、八进制、十六进制。再将0b0100101(二进制)、0345(八进制)、0Xef(十六进制)转换为十进制。注:该题无需用写代码,在纸上手算一下过程,拍照附在文档中提交作业。

答:

67(十进制) 
			64 32 16 8 4 2 1
			 1  0  0 0 0 1 1
67的二进制为1000011
             1 000 011
             1   0   3
67的八进制为103
             100 0011
               4    3
67的十六进制为43
--------------------------------------------------------------------------------------
0b0100101(二进制)                0  1  0 0 1 0 1   
                                 64 32 16 8 4 2 1
 37(十进制)
--------------------------------------------------------------------------------------
0345(八进制)                      0   3   4   5
                                000  011 100 101
           000 0   1   1   1   0   0   1   0   1
                 128  64  32  16   8   4   2   1
                 255-16-8-2=229
229(十进制)  
--------------------------------------------------------------------------------------
0Xef(十六进制)    e   f
               1110 1111
                   1   1   1   0   1   1   1   1
                 128  64  32  16   8   4   2   1
                 255-16=239
239(十进制)
---------------------------------------------------------------------------------------

5.【原码补码反码】对于一个8位原码,01101010和11000110,求它们的补码。已知补码01101010和11000110,求它们的原码。(要求如题4)注:进制和原码等概念属于计算机编程基础知识,建议了解并熟

 原码  01101010               原码  11000110
 补码  01101010               补码  10111010   (负数的补码  原码符号位和最右边的1之间的取反)
 ------------------------------------------------------------------------------------
 补吗  01101010               补码  11000110
 原码  01101010               原码  10111010   (过程与上面相反)

6.【数据类型转换】语句 byte b = 300;编译能通过吗?如果不能为什么呢?怎样让它通过编译呢?(作为简答题说明一下即可)

答:

不能 可以强制转 byte b = (byte) 300; 取补码后8位数转换为十进制数。值为44

7.【算术运算符】以int a = 0; 语句为前提,a = a + 0.1;a += 0.1;两条语句都能正常运行吗?两者有什么区别?(仍作为简答题回答)

答:

int a = 0; a = a + 0.1;int a = 0; a += 0.1;

int a = 0; a = a + 0.1;中由于 0.1 是 double 类型,因此 a + 0.1 运算结果会自动转换为长的double类型,需要强制转换类型才能赋值给 int 型。

int a = 0; a += 0.1; 可以正确编译,因为 a += 0.1; 相当于 a = (int(a + 0.1);其中有隐含的强制类型转换。

a += ba = a + b 的区别:

a += b 如果两边的操作数的精度不一样时会自动向低转化。

a = a + b 则不会自动转化,需要手动进行强制类型转化。

8.【浮点数】float a = 0.1F;double b = 0.1;这两条语句定义的浮点数ab,请问它们相等嘛?为什么?

答:不相等。

float 是32位的单精度,double 是64位的双精度。

浮点数都是近似值,位数越多,表示的就越精确。

9.【位运算符】给出任意一个int类型的正整数,如何快速判断该整数的值,是否是2的整数次幂?(简答题,考虑位运算符)

答:

 num                   8    01000      10    01010
 num-1                      00111            01001
 按位与 (num & (num-1))      00000            01000
 //因此
 int num =正整数;
 if( 0 == (num & (num-1))){
   return true ;
 }else{
   return false ;
 }

10.【表达式】对于一个变量a,给出一个表达式a + "hello",结果的数据类型是什么?

答:

结果是字符串类型 String

从左向右执行遇到字符串 “+” 就是拼接符号,拼接后作为一个字符串再向右执行。

11.【读程序题】读下列代码,指出输出结果以及原因。

int a = 10;
int b;
System.out.println(b = a + 10);

答:

输出结果为:20

因为“+”的优先级比“=”赋值的优先级高,所以先相加再赋值最后把结果b=20输出。

12.【标识符命令规范】分析以下标识符的字符串组成,哪些是符合语法的标识符,哪些不合法?请在这道题下面附上符合语法的标识符命名规范。

1myName      你好%       My_name         Points           $points     
_sys_ta      OK123      _23b#            _3_              main          class  

答:

标识符的命名规则:

由字母、数字、下划线“_”、美元符号“$”或者“¥”组成,

首字符不能是数字。

大小写敏感。

不能是关键字。

1myName 你好% My_name Points $points

__sys_ta OK123 _23b# 3 _ main class

13.【标识符命令规范】标识符的命名除了语法要求外,更重要的是符合约定俗成的规范。下列标识符的字符串组成,都是符合语法要求的,请问**哪些是符合约定俗成命名规范的?哪些不符合?**请在这道题下面附上符合约定俗成规范的Java标识符命名规范。(根据不同语法结构给出)

答:

类名demo test Student Student_

program1 MYDemo myDemo XueSheng

变量名:

age

nianLing 能用单词应该用单词

myName

_name

Variable

包名:

com.baidu Com.Baidu bao.ceshi

注:标识符命名规范相当重要,请大家查阅老师给的文档,先自行学习!

命名规则:

  1. 包:

包类似于操作系统中以文件夹的形式组织文件。

在JAVA语言中,以包来组织JAVA中的类,不同包下可以包含同名的类名。

为了包名的唯一,通常以域名反转的方式来命名包,例:com.baidu.www。

多级包: 以域名(是唯一的)反转的方式来命名包,单词全部小写。

单极包: 一个全部小写的单词。如 test

  1. 类和接口:

单个:首字母大写,其余字母全部小写。如 Student

多个单词:多个单词的首字母均大写,其余字母全部小写 。如:JavaBasic 、MaxAge

  1. 变量和方法:

单个:所有字母小写。 如:value

多个单词:第一个单词首字母小写,从第二个开始,每个单词首字母大写。 如:intValue

  1. 常量:

所有单词字母都大写。如MAX

多个单词:单词之间用_来分割,如MAX_AGE

14.注释的作用是什么?注释会对程序的运行产生影响嘛?注释的内容会存在于Java代码编译执行的哪一部分?

答:

注释的作用:对程序语言进行说明,有助于开发者和用户之间的交流,方便理解程序。

注释不是编程语句,因此被编译器忽略。不会对程序的运行产生影响。

注释只存在于.java文件中,编译的时候会将注释全部自动删除 还有#开头的。

15.如果我想在Java程序中进行键盘输入,提升程序的扩展性。需要按几个步骤进行?请写出步骤

答:

1 . 工具包导包 创建扫描器对象,获取用户的输入

  1. 读取数据,读取数据的方法见下面的详细知识点

  2. 关闭

在这里插入图片描述

在这里插入图片描述

编程基础30题

以下都是编程题,你需要在交作业时,提交代码 + 运行截图。基础三十题只涉及Java基础语法、在B站或者老师提供的文档中都有讲解,可以放心使用

1.【回文数】打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。

**注:**回文数即正反读都是一个数,5位数的话,只要个位与万位相同,十位与千位相同就是一个回文

public class Exercise1 {

    // 1.【回文数】打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。
    public static void main(String[] args) {
        int count = 0;
        for (int i = 10000; i <= 99999; i++) {
            if (IsSymmetricNumber03(i)) {
                System.out.print(i + " ");
                count++;
                if (0 == (count % 10)) {
                    System.out.println();
                }
            }
        }
        System.out.println("5位回文数共有:" + count + "个");

    }

    //方法一
    private static boolean IsSymmetricNumber01(int num) {
        String str = num + "";
        return str.equals(new StringBuffer(num).reverse().toString());
    }

    //方法二
    private static boolean IsSymmetricNumber02(int num) {
        int ge = num % 10;
        int shi = (num / 10) % 10;
        int qian = (num / 1000) % 10;
        int wan = (num / 10000) % 10;
        if (ge == wan && shi == qian) {
            return true;
        } else {
            return false;
        }
    }
    //方法三
    private static boolean IsSymmetricNumber03(int num) {
        String str= num + "";
        for (int i = 0; i < str.length() / 2; i++) {
            if (str.charAt(i) != str.charAt(str.length() - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}

在这里插入图片描述

2.【键盘录入】根据键盘录入的数值1、2、3、4…7输出对应的星期一、星期二、星期三…星期日。(考虑使用switch)

import java.util.Scanner;

public class Exercise2 {
    public static void main(String[] args) {
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请选择");
            System.out.println("1.星期一\t2.星期二\t3.星期三\t4.星期四\t5.星期五\t6.星期六\t7.星期日");
            int choos = sc.nextInt();
            switch (choos){
                case 1:{
                    System.out.println("星期一");
                    break;
                }
                case 2:{
                    System.out.println("星期二");
                    break;}
                case 3:{
                    System.out.println("星期三");
                    break;}
                case 4:{
                    System.out.println("星期四");
                    break;}
                case 6:{
                    System.out.println("星期五");
                    break;}
                case 7:{
                    System.out.println("星期六");
                    break;}
                case 0:{
                    System.exit(0);//退出虚拟机
                    break;
                }
                default:{
                    System.out.println("输入有误");
                    break;                  
                }
            }
        }
    }
}

在这里插入图片描述

3.【if多分支】键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。

学生的分数取值范围[0,100]
分数大于等于90的,评级"优秀";
分数大于等于80,小于90的,评级"良好";
分数大于等于70,小于80的,评级"中等";
分数大于等于60,小于70的,评级"及格";
分数小于60的,评级"不及格";

import java.util.Scanner;

public class Exercise3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入学生成绩");
            int score = sc.nextInt();
            if (score == -1){
                System.exit(0);//退出虚拟机
            }
            if (score > 100 || score < 0) {
                System.out.println("成绩输入不符合规定[0,100]");
            } else {

                if (score >= 90) {
                    System.out.println("优秀");
                } else if (score >= 80) {
                    System.out.println("良好");
                } else if (score >= 70) {
                    System.out.println("中等");
                } else if (score >= 60) {
                    System.out.println("及格");
                } else {
                    System.out.println("不及格");
                }
            }
        }
    }
}

在这里插入图片描述

4 .【水仙花数】请打印出所有的水仙花数。

**注:**所谓的"水仙花数"是指一个三位数,其各位数字的立方和等于该数本身。例如153是一个"水仙花数",因为153 = 1的三次方 + 5的三次方 + 3的三次方。(使用for循环遍历一下就出来了)

ublic class Exercise4 {
    //    ### 4 .【水仙花数】请打印出所有的水仙花数。
//
//  **注:**所谓的"水仙花数"是指一个三位数,其各位数字的立方和等于该数本身。
//  例如153是一个"水仙花数",因为153 = 1的三次方 + 5的三次方 + 3的三次方。
//  (使用for循环遍历一下就出来了)
    public static void main(String[] args) {
        for (int i = 100; i < 999; i++) {
            if (isNarcissus02(i)) {
                System.out.println(i);
            }
        }
    }

    //方法一
    private static boolean isNarcissus01(int num) {
        int ge = num % 10;
        int shi = ((num / 10) % 10);
        int bai = ((num / 100) % 10);
        if (num == Math.pow(ge, 3) + Math.pow(shi, 3) + Math.pow(bai, 3)) {
            return true;
        } else {
            return false;
        }
    }
    //方法二

    private static boolean isNarcissus02(int num) {
        String str = num + ""; //转为字符串
        int k = 0;
        for (int i = 0; i < str.length(); i++) {
            k += (int) Math.pow((str.charAt(i) - 48), 3);
        }
        if (k == num) {
            return true;
        } else {
            return false;
        }
    }
}

在这里插入图片描述

5.【求素数】判断101-200之间有多少个素数,并输出其中所有素数。

**注:**素数即是除了1和它本身以外不再有其他因数的自然数。程序中可以用这个数,遍历除以2到这个数减去1。如果能够被整除,则表明此数不是素数,反之是素数

public class Exercise5 {
    //5.【求素数】判断101-200之间有多少个素数,并输出其中所有素数。
    public static void main(String[] args) {
        int count = 0;

        for (int i = 101; i < 200; i += 2) {

            if (isPrime(i)) {
                System.out.print(i + " ");
                count++;
            }
        }
        System.out.println("\n共"+count+"个素数");
    }

    private static boolean isPrime(int i) {
        if (i < 2) return false;
        for (int j = 2; j * j <= i; j++) {
            if (0 == i % j) {
                return false;
            }
        }
        return true;
    }
}

在这里插入图片描述

6.【嵌套for循环】打印下列图案(等腰三角形)要求,根据键盘录入的行数,决定等腰三角形的行数。想不到思路直接百度一下吧。

在这里插入图片描述

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入行");
        int hang = sc.nextInt();
        for (int i = 0; i < hang; i++) {
            for (int k = hang - i; k > 0; k--) {
                System.out.print(" ");
            }
            for (int j = 0; j < i * 2 + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

7.【嵌套for循环】打印九九乘法表。(和题6基本一样)

package com.itstudy.exercises50;

public class Exercise7 {
    public static void main(String[] args) {
        for (int i = 1; i <=9 ; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j+"x"+i+"="+i*j+"\t");
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

8.【求完数】一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完数"。请编程求出1000以内的所有完数。

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise8 {
    public static void main(String[] args) {
        int sum = 0;
        for (int n = 1; n <= 1000; n++) {
            sum =0; //每个数开始时sum从0开始
            for (int i = 1; i < n; i++) {
                if (n % i == 0)
                    sum += i;
            }
            if (sum == n)
                System.out.print(n + " ");
        }
    }
}

在这里插入图片描述

9.【求不重复数字】有1、2、3、4一共四个数字,能组成多少个不相等且无重复数字的三位数?都是多少?

**注:**可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的就可以了。

package com.itstudy.exercises50;

public class Exercise9 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 100; i < 999; i++) {
            int ge = i % 10;
            int shi = (i / 10) % 10;
            int bai = (i / 100) % 10;
            if (!(ge > 4 || shi > 4 || bai > 4||ge*shi*bai==0)
                    && ge != shi
                    && shi != bai
                    && bai != ge){
                System.out.print(i+" ");
                count++;
            }
        }
        System.out.println("\n共"+count+"个");
    }
}

在这里插入图片描述

10.【根据输入求输出】键盘录入一个正整数,请求:1.它是几位数?2.逆序打印出各位数字。

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数");
        int n = sc.nextInt();
        int g = getDigits(n);//得到位数
        int re = reverseNmu(n);//数字反转
        System.out.println(n+"的位数是"+g);
        System.out.println(n+"逆序数是"+re);

    }

    private static int reverseNmu(int number) {
        String s = number + "";
        StringBuilder sb = new StringBuilder(s);
        s = sb.reverse().toString();
       // System.out.println(s);
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
           sum += (s.charAt(i)-48)*Math.pow(10,s.length()-1-i);
        }
        return sum;

    }

    private static int getDigits(int n) {
        int count = 1;
        while (n > 10) {
            if (n / 10 != 0) {
                count++;
                n /= 10;
            }
        }
        return count;
    }

}

在这里插入图片描述

11.【数列的前n项和】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

**注:**提前告诉你答案是32.66026079864164

package com.itstudy.exercises50;

public class Exercise11 {

    public static void main(String[] args) {
        double sum = 0;
        double fm = 1;
        double fz = 2;
        double temp = 0;
        for (int i = 0; i < 20; i++) {

            sum += fz / fm;
            temp = fz;
            fz = fm + fz;
            fm = temp;
        }
        System.out.println(sum);
    }
}

在这里插入图片描述

12.【累加】求前n个数的和,其中n>0。

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise12 {
    //### 12.【累加】求前n个数的和,其中n>0。
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入n");
        int n = sc.nextInt();
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

在这里插入图片描述

13.【累乘】求前n个数的积,其中n>0。

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise13 {
    //13.【累乘】求前n个数的积,其中n>0。
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入n");
        int n = sc.nextInt();
        int pdct = 1;

        for (int i = 1; i <= n; i++) {
            pdct *= i;
        }
        System.out.println(pdct);
    }
}

在这里插入图片描述

14.【求最大值】分别用if和三目运算符求三个数的最大值。比较一下两种方式,哪种比较好?

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise14 {
    //14.【求最大值】分别用if和三目运算符求三个数的最大值。比较一下两种方式,哪种比较好?
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a, b, c;
        System.out.println("请输入3个数(空格隔开)");
        a = sc.nextInt();
        b = sc.nextInt();
        c = sc.nextInt();
        int max = getMax02(a, b, c);
        System.out.println("最大值是:"+max);
    }

    //if方法
    private static int getMax01(int a, int b, int c) {
        if (a > b) {
            if (a > c) {
                return a;
            } else {
                return c;
            }
        } else {
            if (b > c) {
                return b;
            } else {
                return c;
            }
        }
    }

    //三目运算符方法
    private static int getMax02(int a, int b, int c) {
        int max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
        return max;
    }
}

在这里插入图片描述

if方法逻辑更加的清晰易懂

三目运算符方法代码更加简洁;

两者性能不同,三目运算符性能略高。相同的代码,使用if-else执行的耗时是三目运算符的两倍以上。

从总体上看,三目运算符效率高。更好。

15.【根据条件求数】一个整数,它加上100或者268后都是一个完全平方数,请问在1万以内,这样的数有几个,分别是多少?

**注:**使用Math.sqrt(double a)方法可以求a的平方根。

package com.itstudy.exercises50;

public class Exercise15 {
    public static void main(String[] args) {
        int num1 = 0;//+100后的数
        int num2 = 0;//+268后的数
        int count = 0;//计数变量
        for (int i = 0; i < 10000; i++) {
            num1 = i + 100;
            num2 = i + 268;
            if (num1 == (int) Math.sqrt(num1) * (int) Math.sqrt(num1) 
                || num2 == (int) Math.sqrt(num2) * (int) Math.sqrt(num2)) {
                System.out.print(i+" ");
                count++;
                //每行打印10个
                if (count%10 == 0){
                    System.out.println();
                }
            }

        }
        System.out.println("\n这样的数一共有:"+count+"个");
    }

}

在这里插入图片描述

16.【求奇数和】求100以内的所有奇数/偶数的和。

package com.itstudy.exercises50;

public class Exercise16 {
    public static void main(String[] args) {
        int oddSum = 0;//奇数和
        int evenSum = 0;//偶数和
        for (int i = 0; i <= 100; i += 2) {
            evenSum += i;
        }
        for (int i = 1; i <= 100; i += 2) {
            oddSum += i;
        }
        System.out.println("100以内的所有奇数和:" + oddSum);
        System.out.println("100以内的所有偶数和:" + evenSum);
    }

}

在这里插入图片描述

17.【自由落体】假如一个小球从100米高度自由落下,每次落地后就反跳回原高度的一半。那么求它在第10次落地时,共经过多少米?第10次反弹多高?

package com.itstudy.exercises50;

public class Exercise17 {
   
    public static void main(String[] args) {
        double height = 100; //初始高度
        double s = 100;
        //反弹次数10次
        for (int i = 0; i < 10; i++) {
            s += (height /= 2) * 2;
        }
        //s的初始值是100即上方循环开始前已经是第一次落地了, 第10次落地也即第10次反弹的开始
        //因此减去第10次谈起后并落地的路程2*height(第10次弹起的高度)
        System.out.println("第10次落地共经过"+(s - 2 * height)+"米");
        System.out.println("第10次反弹高度为"+height+"米");
    }
}

在这里插入图片描述

18.【被9整除】键盘录入一个数,请判断它数能被几个9整除 。如81就可以被2个9整除。

package com.itstudy.exercises50;

import com.sun.source.tree.WhileLoopTree;

import java.util.Scanner;
import java.util.StringJoiner;

//18.【被9整除】键盘录入一个数,请判断它数能被几个9整除 。如81就可以被2个9整除。
public class Exercise18 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int count = 0;
        int temp = num;
        while (true) {
            if (num % 9 == 0) {
                count++;
                num = num / 9;
            } else {
                break;
            }
        }
        System.out.println(temp + "可以被" + count + "个9整除");
        if (count!=0) {
            StringJoiner sj = new StringJoiner("*");
            for (int i = 0; i < count; i++) {
                sj.add("9");
            }
            System.out.println("如:" + sj.toString() + "*" + num + " = " + temp);
        }else{
            System.out.println("1*"+num+" = "+temp);
        }
    }
}

在这里插入图片描述

19.【判断奇偶数】键盘录入一个int数字,判断输出它是奇数还是偶数。

package com.itstudy.exercises50;

import java.util.Scanner;

//19.【判断奇偶数】键盘录入一个int数字,判断输出它是奇数还是偶数。
public class Exercise19 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int num = 0;
        while (true) {
            num = sc.nextInt();
            if (num < 0){
                System.out.println("请输入自然数");
            }else {
                break;
            }
        }
        if (num % 2 == 0) {
            System.out.println(num + "是偶数");
        } else {
            System.out.println(num + "是奇数");
        }

    }
}

在这里插入图片描述

20.【分解质因数】将一个大于2的正整数分解质因数。例如:输入3的话,输出 3=3; 输入6,输出6 = 2 *3等。

package com.itstudy.exercises50;

import java.util.Scanner;

//20.【分解质因数】将一个大于2的正整数分解质因数。
// 例如:输入3的话,输出 3=3; 输入6,输出6 = 2 *3等。
public class Exercise20 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个大于2整数");
        int num = sc.nextInt();
        fengjie(num);
    }
    
    private static void fengjie(int num) {
        for (int i = 2; i * i < num; i++) {
            if (num % i == 0) {
                System.out.println(num + "=" + (num / i) + "*" + i);
            }
        }
    }
}

在这里插入图片描述

21.【排序】键盘输入三个整数x、y、z,请把这三个数由小到大输出。

package com.itstudy.exercises50;

import java.util.Scanner;


public class Exercise21 {
    // ### 21.【排序】键盘输入三个整数x、y、z,请把这三个数由小到大输出。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入3个整数(空格隔开)");

        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        if (a < b) {           
            a = a ^ b;//a和b异或  a用b加密赋给a
            b = a ^ b;//用b解密又得回了a,赋给b
            a = a ^ b;//用b(此时的b是最初的a)解密得到了最初的b,把他赋给a
        }
        if (a < c) {
            a = a ^ c;
            c = a ^ c;
            a = a ^ c;
        }
        if (b < c) {
            b = b ^ c;
            c = b ^ c;
            b = b ^ c;
        }
        System.out.println(a + " " + b + " " + c);
    }

}

在这里插入图片描述

22. 【交换值】任意给两个整数(int)值,请交互它们的值。

package com.itstudy.exercises50;

import java.util.Scanner;
public class Exercise22 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个整数(空格隔开)");
        int a = sc.nextInt();
        int b = sc.nextInt();
        System.out.printf("交换前a = %d b = %d\n",a,b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.printf("交换后a = %d b = %d\n",a,b);
    }
}

在这里插入图片描述

23.【求自守数】自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 =87909376。请求出10000(一万)以内的自守数的个数,并分别输出。

package com.itstudy.exercises50;

public class Exercise23 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10000; i++) {
            if (isSelfNumber(i)) {
                System.out.print(i + " ");
                count++;
            }
        }
        System.out.println("\n10000(一万)以内有" + count + "个自守数");
    }
    private static boolean isSelfNumber(int n) {
        int pow = n * n;
        String k = n + "";
        String source = pow + "";
        if (k.equals(source.substring((source.length() - k.length())))) {
            return true;
        } else {
            return false;
        }
    }
}

在这里插入图片描述

24.【循环练习】给20块钱买饮料,每瓶饮料3块钱,喝完之后退瓶子可以换回1块钱。问最多可以喝到多少瓶饮料?

package com.itstudy.exercises50;

import com.sun.jdi.PathSearchingVirtualMachine;public class Exercise24 {
    public static void main(String[] args) {
        int money = 20;
        int bottle = 0;//饮料
        int empty = 0;//空瓶
        while (money / 3 > 0) {
            empty = money / 3;
            bottle = bottle + money / 3;
            money = money % 3 + empty;
        }
        System.out.println("最多可以喝" + bottle + "瓶饮料");
        System.out.println("最后还剩" + money + "元");
    }
}

在这里插入图片描述

25.【循环练习】井里有一只蜗牛,他白天往上爬5米,晚上掉3.5米,井深56.7米,计算蜗牛需要多少天才能从井底到爬出来。

package com.itstudy.exercises50;

import java.sql.SQLOutput;

public class Exercise25 {
    public static void main(String[] args) {
        double depth = 56.7;
        double height = 0;
        int day = 0;
        while (height < depth) {
            height += 5;
            day++;
            if (height > depth) {
                break;
            }
            height -= 3.5;
        }
        System.out.println("蜗牛需要" + day + "天才能从井底到爬出来");
    }
}

在这里插入图片描述

26.【键盘录入】键盘输入任意一个正整数,求各位数字之和。

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise26 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        System.out.println("各位数字之和" + sum);
    }
}

在这里插入图片描述

27.【求和】打印出1-100之间所有不是7的倍数和不包含7的数字,并求和。

package com.itstudy.exercises50;

public class Exercise27 {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (!(i % 7 == 0 || i % 10 == 7 || (i / 10) % 10 == 7)) {
                System.out.print(i + " ");
                sum += i;
            }
        }
        System.out.println("\n和为:" + sum);
    }
}

在这里插入图片描述

28.【分数累加】编写一个函数,输入n为偶数时,求1/2 + 1/4 +1/6 + … + 1/n的结果;当输入n为奇数时,求1/1 + 1/3 + 1/5 +… + 1/n 的结果。

package com.itstudy.exercises50;

import java.util.Scanner;
//28.【分数累加】编写一个函数,
// 输入n为偶数时,
// 求1/2 + 1/4 +1/6 + ... + 1/n的结果;
// 当输入n为奇数时,
// 求1/1 + 1/3 + 1/5 +... + 1/n 的结果。
public class Exercise28 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个自然数");
        int n = sc.nextInt();
        double sum = 0;
        if (n % 2 == 0) {
            for (int i = 2; i <= n; i += 2) {
                sum += 1.0 / i;
            }
        } else {
            for (int j = 1; j <= n; j += 2) {
                sum += 1.0 / j;
            }
        }
        System.out.println("结果为:" + sum);
    }
}

在这里插入图片描述

29.【switch练习】输入年份和月份,输出这个月应该有多少天(使用switch结构,需要考虑闰年和平年,注意case穿越)

package com.itstudy.exercises50;

import java.util.Scanner;

public class Exercise29 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份月份(空格隔开)");
        int year = sc.nextInt();
        int month = sc.nextInt();

        switch (month) {
            case 1: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            case 2: {
                if (((year % 4 == 0) && ((year % 100) != 0)) || year % 400 == 0) {
                    System.out.println(year + "年" + month + "月有29天");
                }else {
                    System.out.println(year + "年" + month + "月有28天");
                }
                break;
            }
            case 3: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            case 4: {
                System.out.println(year + "年" + month + "月有30天");
                break;
            }
            case 5: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            case 6: {
                System.out.println(year + "年" + month + "月有30天");
                break;
            }
            case 7: {
                System.out.println(year + "年" + month + "月有30天");
                break;
            }
            case 8: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            case 9: {
                System.out.println(year + "年" + month + "月有30天");
                break;
            }
            case 10: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            case 11: {
                System.out.println(year + "年" + month + "月有30天");
                break;
            }
            case 12: {
                System.out.println(year + "年" + month + "月有31天");
                break;
            }
            default: {
                System.out.println("输入错误");
                break;
            }
        }
    }
}

在这里插入图片描述

30.【三目运算符】某小伙想定一份外卖,商家的优惠方式如下:鱼香肉丝单点 24 元,油炸花生米单点 8 元,米饭单点 3 元。订单满 30 元 8 折优惠。鱼香肉丝优惠价 16 元,但是优惠价和折扣不能同时使用。那么这个小伙要点这三样东西,最少要花多少钱?

public class Exercise30 {
    public static void main(String[] args) {
        System.out.println("最少要花"+((24+8+3)*0.8 < (16+8+3)?(24+8+3)*0.8:(16+8+3))+"元");
    }
}

在这里插入图片描述

扩展5题

扩展5题,大多涉及方法 、数组 、递归 等知识,需要继续往后面学习才能够做得出来。仅作为扩展和补充,如果你有精力和能力,完全可以尝试去做出来,但不做强制要求。

1.【递归经典问题-不死神兔】有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? (其实就是斐波那契数列)

package com.itstudy.exercises50;

import java.util.Scanner;

public class Expand1 {
    //1.【递归经典问题-不死神兔】有一对兔子,从出生后第3个月【起】每个月都生一对兔子,
    // 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
    // (其实就是斐波那契数列)
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("需要打印至几月份?");
        int month = sc.nextInt();
        for (int i = 1; i <= month; i++)   //打印 1 ~ num 月份的兔子数
            System.out.println("第 " + i + " 月兔子总共有 " + rabbit(i) + "对。");
    }
    //兔子 对数为1,1,2,3,5,8,13,21
    private static int rabbit(int month) {
        if (month == 1 || month == 2)
            return 1; //第一个月和第二个月 兔子的对数均为1 ,没有出生的新兔子
        return rabbit(month - 1) + rabbit(month - 2);
    }

}

在这里插入图片描述

2.【递归】有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

package com.itstudy.exercises50;

public class Expand2 {
    //2.【递归】有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
    // 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。
    // 问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

    public static int ageFunction(int people) {
        if (people == 1)
            return 10;
        return ageFunction(people - 1) + 2;
    }
    public static void main(String[] args) {
        System.out.print("第五个人 " + ageFunction(5) + " 岁");
    }
}

在这里插入图片描述

3.【排序】随机给十个数字,对它们进行排序。(可以给一个有10个整数元素的数组,然后对数组排序)

package com.itstudy.exercises50;

import java.util.Random;

public class Expand3 {
     public static void main(String[] args) {
        int[] arr = new int[10];
        //随机给arr十个数字
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Random().nextInt(arr.length);
        }
        System.out.print("排序后:");
        //冒泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = false;   //表示本趟冒泡是否发生交换的标志
            for (int j = arr.length - 1; j > i; j--){   //一趟冒泡过程(向前冒)
                if (arr[j - 1] > arr[j]) {            //若为逆序
                    //swap (arr[j-1],arr[j]) 交换
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;

                    flag = true;
                }
            }
            if (flag == false)      //本趟遍历后没有发生交换,说明表已经有序
                break;  //或者return;
        }

        //打印数组
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + "   ");       
        }
         System.out.println();
    }
}

在这里插入图片描述

4.【数组元素的插入】有一个已经排好序的int数组{1, 2, 3,4, 5, 6, 7, 8}。现输入一个数(要求该数在1-8之间),按原来的规律将它插入数组中。

package com.itstudy.exercises50;

import java.util.Scanner;

//4.【数组元素的插入】有一个已经排好序的int数组{1, 2, 3, 4, 5, 6, 7, 8}。
// 现输入一个数(要求该数在1-8之间),按原来的规律将它插入数组中。
public class Expand4 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入1-8之间的数");
        int x = sc.nextInt();
        int newarr[]= new int[arr.length+1];
        int i = 0;
        //拷贝比x大的到newarr的右边
        for ( i = arr.length-1; i >= 0; i--) {
            if (arr[i]>x){
                newarr[i+1] =arr[i];
            }else {
                break;
            }
        }
        //放置x
        newarr[i+1]=x;
        //放置比x小的元素到newarr左边
        for (;i>=0;i--){
            newarr[i]=arr[i];
        }
        arr = newarr;//把newarr的地址交给arr  旧的arr被回收
        System.out.println("按原来的规律将它插入数组中后:");
        for (int j = 0; j < arr.length; j++) {
            System.out.print(arr[j]+" ");
        }
    }

}

在这里插入图片描述

5.【数组元素的交换】给出一个int数组,把它最大的元素与第一个元素交换,最小的元素与最后一个元素交换,输出交换后的数组。

package com.itstudy.exercises50;

import java.util.Random;

public class expand5 {
    //### 5.【数组元素的交换】给出一个int数组,把它最大的元素与第一个元素交换,
    // 最小的元素与最后一个元素交换,输出交换后的数组。
    //本题的关键在于找出给出的int数组的最大元素和最小元素
    public static void main(String[] args) {
        Random r = new Random();
        //创建一个长度随机,元素内容随机的数组
        int num = r.nextInt(9) + 2;
        int arr[] = new int[num];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(10);
        }
        System.out.print("随机生成的int数组是:");
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        int min = 0, max = 0;        //min 和 max 分别是数组中最小值的下标和最大值的下标
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < arr[min])
                min = i;
            if (arr[i] > arr[max])
                max = i;
        }
        System.out.println("数组中的最大值是 " + arr[max] + ",最小值是 " + arr[min]);
        //最大元素与第一个元素交换
        int temp = arr[0];
        arr[0] = arr[max];
        arr[max] = temp;
        //最小元素与最后一个元素交换
        temp = arr[arr.length - 1];
        arr[arr.length - 1] = arr[min];
        arr[min] = temp;
        System.out.print("交换后的数组是:");
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

]

5.【数组元素的交换】给出一个int数组,把它最大的元素与第一个元素交换,最小的元素与最后一个元素交换,输出交换后的数组。

package com.itstudy.exercises50;

import java.util.Random;

public class expand5 {
    //### 5.【数组元素的交换】给出一个int数组,把它最大的元素与第一个元素交换,
    // 最小的元素与最后一个元素交换,输出交换后的数组。
    //本题的关键在于找出给出的int数组的最大元素和最小元素
    public static void main(String[] args) {
        Random r = new Random();
        //创建一个长度随机,元素内容随机的数组
        int num = r.nextInt(9) + 2;
        int arr[] = new int[num];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(10);
        }
        System.out.print("随机生成的int数组是:");
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        int min = 0, max = 0;        //min 和 max 分别是数组中最小值的下标和最大值的下标
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < arr[min])
                min = i;
            if (arr[i] > arr[max])
                max = i;
        }
        System.out.println("数组中的最大值是 " + arr[max] + ",最小值是 " + arr[min]);
        //最大元素与第一个元素交换
        int temp = arr[0];
        arr[0] = arr[max];
        arr[max] = temp;
        //最小元素与最后一个元素交换
        temp = arr[arr.length - 1];
        arr[arr.length - 1] = arr[min];
        arr[min] = temp;
        System.out.print("交换后的数组是:");
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

在这里插入图片描述

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Java50经典编程题是一套经典的编程题目集合,其中包含了各种不同类型的编程问题。这些题目涵盖了循环、条件语句、方法调用等多个方面的知识点。其中一题目是读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。\[1\]另一题目是计算字符串中子串出现的次数。\[2\]还有一题目是找到一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数。\[3\]这些题目都是通过使用循环、条件语句和方法调用等技巧来解决问题的。如果你对这些题目感兴趣,可以尝试自己编写代码来解决它们。 #### 引用[.reference_title] - *1* [java编程练习题50](https://blog.csdn.net/fx_gcw2018/article/details/108860979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Java基础编程题50题](https://blog.csdn.net/yuweiran_5/article/details/124488415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值