Java基础50道经典练习题(22年新版) 您所在的位置:网站首页 java基础课后题及答案 Java基础50道经典练习题(22年新版)

Java基础50道经典练习题(22年新版)

2024-02-27 14:29| 来源: 网络整理| 查看: 265

目录 一、基础问答15题1、【基本概念问答】2、【环境变量配置问答】3、【命令行编程】4、【进制转换】5、【原码补码反码】6、【数据类型转换】7、【算术运算符】8、【浮点数】9、【位运算符】10、【表达式】11、【读程序题】12、【标识符命令规范】13、【标识符命令规范】14、【注释】15、【键盘输入】 二、编程基础30题1、【回文数】2、【键盘录入-switch-求星期】3、【if多分支-求成绩】4、【水仙花数】5、【求素数】6、【嵌套for循环-杨辉三角形】7、【嵌套for循环-九九乘法表】8、【求完数】9、【求不重复数字】10、【根据输入求输出-求位数、逆序输出】11、【数列的前n项和】12、【累加】13、【累乘】14、【求最大值】15、【根据条件求数-加100/268是完全平方】16、【求奇数/偶数和】17、【自由落体】18、【被几个9整除】19、【判断奇偶数】20、【分解质因数】21、【三个数由小到大排序】22、【交换值】23、【求自守数】24、【循环练习-买饮料】25、【循环练习-蜗牛爬井】26、【键盘录入-求各位数之和】27、【求和-去除7倍数和包含7】28、【分数累加】29、【switch练习-某月天数】30、【三目运算符-点餐优惠方式】 三、扩展5题1、【递归经典问题-不死神兔】2、【递归】3、【排序】4、【数组元素的插入】5、【数组元素的交换】

一、基础问答15题 1、【基本概念问答】

请问Java语言是跨平台的吗?JVM是跨平台的吗?为什么?

答:   Java语言是跨平台的,JVM是不跨平台的。   Java能跨平台正是以JVM不跨平台为代价的。   Java的跨平台性由JVM实现,即JVM用于保证java的跨平台的特性。   原理分析:   JVM是在机器和编译程序之间加入的一层抽象的虚拟机器,   这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。   编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由 解释器 来将虚拟机代码转换为特定系统的机器码执行。   在Java中,这种供虚拟机理解的代码叫做字节码(即Java源代码经过虚拟机编译器编译后产生的文件,扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机,使Java程序无须重新编译便可在多种不同的计算机上运行。   每一种平台的解释器是不同的,但是实现的虚拟机是相同的。   Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm(字节码由虚拟机解释执行)---->jvm中解释器(虚拟机将每一条要执行的字节码送给解释器)----->机器可执行的二进制机器码---->程序运行。

2、【环境变量配置问答】

为什么要配置Java环境变量?

不配置环境变量可不可以命令行编译执行Java代码?

请尝试配置环境变量,达到在命令行(cmd)窗口输入qq 命令就能启动qq的效果。(效果截图)

答:  

(1)path环境变量的配置:   path是配置Windows可执行文件的搜索路径,即扩展名为.exe的程序文件所在的目录,   用于指定DOS窗口命令的路径。   告诉操作系统到哪里去找javac可执行程序配置。   ① 永久配置方式:   JAVA_HOME=%安装路径%\Java\jdk   path=%JAVA_HOME%\bin   ② 临时配置方式:   set path=路径;

(2)classpath的配置:   classpath是配置class文件所在的目录,用于指定类搜索路径,JVM就是通过它来寻找该类的class类文件的。   给jvm用,告诉jvm到哪里加载字节码文件配置。   如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件;   如果指定了classpath,那么会在指定的目录下查找要运行的类文件。

(3)配置环境变量,达到在命令行(cmd)窗口输入wechat 命令就能启动 微信 的效果。:   注:因为 qq 启动 涉及到账号 和 密码位数,故将 启动qq,改成启动 微信。两者操作 完全一样。   ① 设置 Path 环境变量之前:

  ② 设置 Path 环境变量之后   在Path变量中添加wechat启动程序的路径,即可以在任意目录下,通过命令行执行。

3、【命令行编程】

新建一个Java文件, 然后手写Hello World程序。

(要求记事本完成,该题目提交 Helloworld程序的代码及命令行cmd运行截图即可)

答:

4、【进制转换】

将67转换为二进制、八进制、十六进制。

再将0b0100101(二进制)、0345(八进制)、0Xef(十六进制) 转换为十进制。

注:该题无需写代码,在纸上手算一下过程,拍照附在文档中提交作业。

答:  

(1)相应知识点:   十进制数:在数字的右下角标注10或D。默认是十进制。   二进制数:在数字的右下角标注2或B。                   Java语言中0b开头。   八进制数:在数字的右下角标注8或字母O。                   Java语言中数字0开头。   十六进制:在数字的右下角标注16或H。                     Java语言中0X开头。   进制之间的转换:   ① 二进制 --> 十进制   将二进制数写成按权展开式,并将式中各乘积项的积相加,即得对应十进制数。 ② 十进制 --> 二进制 / 八进制等   分为整数部分转换和小数部分转换   在十进制的小数部分转换中,有时连续乘以2不一定能使小数部分等于0,这说明该十进制小数不能用有限位二进制小数表示。这时,只要取足够多的位数,使其误差达到所要求的精度就可以了。   示例:十进制转换成二进制 ③ 二进制 --> 八进制 ④ 八进制 --> 二进制 ⑤ 二进制 --> 十六进制 ⑥ 十六进制 --> 二进制

(2)67转换为二进制、八进制、十六进制。   ① (67)10 转换成二进制      ​ 67 / 2 = 33   ​   ​(a0 = 1)   ​   ​   ​最低整数位      ​​ 33 / 2 = 16   ​   ​(a1 = 1)      ​​ 16 / 2 = 8   ​   ​  (a2 = 0)      ​​ 8 / 2 = 4   ​   ​    ​(a3 = 0)      ​​ 4 / 2 = 2   ​   ​     ​​(a4 = 0)      ​​ 2 / 2 = 1   ​   ​   ​  ​(a5 = 0)      ​​ 1 / 2 = 0       ​   ​​(a6 = 1)   ​   ​   ​最高整数位   故 (67)10 = (1000011)2     ② (67)10 转换成八进制      ​​​ 67 / 8 = 8    ​​   ​​   ​​(a0 = 3)    ​​   ​​   ​​最低整数位      ​​​ 8 / 8 = 1    ​​   ​​   ​​   ​​(a1 = 0)      ​​​ 1 / 2 = 0   ​​   ​​   ​​   ​​ (a2 = 1)    ​​   ​​   ​​最高整数位   故 (67)10 = (103)O     ③ (67)10 转换成十六进制      ​​​ 67 / 16 = 4    ​​   ​​ (a0 = 3)    ​​   ​​   ​​   ​​ 最低整数位      ​​​ 4 / 16 = 0    ​​   ​​ (a1 = 4)    ​​   ​​   ​​   ​​   ​​ 最高整数位   故 (67)10 = (43)H

(3)将0b0100101(二进制)、0345(八进制)、0Xef(十六进制) 转换为十进制。   (0100101)B = 0 × 26 + 1 × 25 + 0 × 24 + 0 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = (37)B   (0345)O = 0 × 83 + 3 × 82 + 4 × 81 + 5 × 80 = (229)B   (ef)H = 14 × 161 + 15 × 160 = (239)B

5、【原码补码反码】

对于一个8位原码,01101010和11000110, 求它们的补码。

已知补码01101010和11000110,求它们的原码。(要求如题4)

注:进制和原码等概念属于计算机编程基础知识,建议了解并熟悉它。

答:   (1)相应知识点:   正数的原码 = 补码   负数原码 --> 补码:符号位不变,其余位取反,末位 + 1。   补码的补码(补码求补)= 补码对应的原码。     (2)练习   正数原码 01101010 = 补码   负数原码 11000110 补码是 10111010 (符号位不变,其余位取反,末位 + 1)   正数补码 01101010 = 原码   负数补码 11000110 原码是 10111010 (符号位不变,其余位取反,末位 + 1)

6、【数据类型转换】

语句 byte b = 300; 编译能通过吗?

如果不能为什么呢?怎样让它通过编译呢?

(作为简答题说明一下即可)

答:   1)编译结果如下:   编译不通过。   2)编译不通过的原因如下:   ①相应知识点   精度从高到低 double float long int short(char) byte   自动类型转换(隐式转换):低精度–>高精度                                                  boolean 类型的值不能直接转化为其它数据类型的值。                                                  short、char、byte相互之间不转换,他们参与运算会首先转换为 int 类型。   强制类型转换(显示转换): 高精度–>低精度(精度会下降)   ②具体原因:   byte的表示范围是 -128~127,300超出byte表示范围,故无法完成赋值。     3)通过编译的解决方法:   进行强制类型转换   byte b = (byte)300; // 此时,输出的b为44   或者将变量b定义成int类型,或者将byte类型的b变量的赋值,改为 -128~127内的一个数。

7、【算术运算符】

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

答:

a+=b 和 a=a+b 的区别:   ① a += b执行过程:先计算出a的值,然后用一个temp对象存储,之后和b进行相加,然后将值赋值给a引用。   += 如果两边的操作数的精度不一样时会自动向低转化。   ② a = a+b 执行过程:先计算 a + b,然后再赋值给a引用,给a引用的时候如果 引用a 有计算过程,则会再次计算。   a = a+b则不会自动转化,需要手动进行强制类型转化。

  练习:   int a = 0; a = a + 0.1;(x)与 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);其中有隐含的强制类型转换。

8、【浮点数】

float a = 0.1F; 和double b = 0.1;

这两条语句定义的浮点数a和b,请问它们相等嘛?为什么?

答:不相等。   float 是32位的单精度,double 是64位的双精度。   浮点数都是近似值,位数越多,表示的就越精确。

9、【位运算符】

给出任意一个int 类型的正整数,如何快速判断该整数的值,是否是2的整数次幂?

(简答题,考虑位运算符)

public class Test { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个数:"); int num = input.nextInt(); /* //输入的数用二进制来表示,若只有1个1,其余位全部为0,则是 2 的整数次幂,反之,则不是。 //比如 8 = 1000 ,8&7 为 1000 & 0111 = 0000 ,是 2 的整数次幂。 //与 二进制的 满2进1 有关 if ((int)(num & (num - 1) )== 0) System.out.print("您输入的数是2的整数次幂"); else System.out.print("您输入的数不是2的整数次幂"); */ //不采用位运算 boolean flag = true; while (num != 1) if (num % 2 != 0) { flag = false; System.out.print("您输入的数不是2的整数次幂"); break; } else num /= 2; if (flag) System.out.print("您输入的数是2的整数次幂"); input.close(); } }

运行结果:

10、【表达式】

对于一个变量a,给出一个表达式a + “hello” ,结果的数据类型是什么?

答:   (1) “+” 运算符:   ① 可表示加法运算;   ② 可表示正数;   ③ 可表示字符串拼接;   操作数1 + 操作数2 + … 在多个操作数中,只要有一个是字符串,"+“操作执行的就是字符串拼接。   举例:   System.out.println(“hello” + ‘a’ + 1);         // helloa1   System.out.println(‘a’ + 1 + “hello”);        // 98hello  (‘a’的ascii码是97)   System.out.println(“5+5=”+5+5);             //5+5=55   System.out.println(5+5+”=5+5");             //10=5+5     (2)练习答案:   对于一个变量a,给出一个表达式a + “hello” ,结果的数据类型是 字符串类型,输出的是变量a的值和hello组成的字符串。

11、【读程序题】

读下列代码,指出输出结果以及原因。

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

答:   输出结果是 20   b = a + 10;表示将a + 10 的结果赋值给b,于是b的结果是20 ,这个表达式的值是赋值后b的值。

12、【标识符命令规范】

分析以下标识符的字符串组成,哪些是符合语法的标识符,哪些不合法?

请在这道题下面附上符合语法的标识符命名规范。

1) 1myName              × 2.)你好%                    × 3.)My_name              √ 4.)Points                    √ 5.)$point                    √ 6.)_sys_ta                  √ 7) OK123                    √ 8)_23b#                      × 9)_3_                          √ 10)main                       √ 11)class                      ×

答:   标识符的命名规则:   由字母、数字、下划线“_”、美元符号“$”或者“¥”组成,首字符不能是数字。   大小写敏感。   不能是关键字。

13、【标识符命令规范】

标识符的命名除了语法要求外,更重要的是符合约定俗成的规范。

下列标识符的字符串组成,都是符合语法要求的,请问哪些是符合约定俗成命名规范的?哪些不符合?

请在这道题下面附上符合约定俗成规范的Java标识符命名规范。(根据不同语法结构给出)

类名: 1)demo                       × 2)test                          × 3) Student                   √ 4) Student_                  × 5) program1                  × 6) MYDemo                  × 7) myDemo                  × 8) XueSheng                √

变量名: 9)age                             √ 10) nianLing                  √ 11)myName                  √ 12)_name                     × 13)Variable                    ×

包名: 14)com.baidu                   √ 15)Com.Baidu                   × 16)bao.ceshi                     ×

注:标识符命名规范相当重要。

答:   命名规则:   (1)包:   包类似于操作系统中以文件夹的形式组织文件。   在JAVA语言中,以包来组织JAVA中的类,不同包下可以包含同名的类名。   为了包名的唯一,通常以域名反转的方式来命名包,例:com.baidu.www。   多级包: 以域名(是唯一的)反转的方式来命名包,单词全部小写。   单极包: 一个全部小写的单词。如 test     (2)类和接口:   单个:首字母大写,其余字母全部小写。如 Student   多个单词:多个单词的首字母均大写,其余字母全部小写 。如:JavaBasic 、MaxAge     (3)变量和方法:   单个:所有字母小写。 如:value   多个单词:第一个单词首字母小写,从第二个开始,每个单词首字母大写。 如:intValue     (4)常量:   所有单词字母都大写。如MAX   多个单词:单词之间用_来分割,如MAX_AGE   具体的Java开发规范文档:阿里巴巴Java开发手册(嵩山版)

14、【注释】

注释的作用是什么?

注释会对程序的运行产生影响嘛?

注释的内容会存在于Java代码编译执行的哪一部分?

答:   (1)知识点  

单行注释   格式:// 注释文字  多行注释   格式:/* 注释文字 */  文档注释   格式:/** 注释文字 */   可用来生成网页格式的帮助文档。   多行和文档注释都不能嵌套使用。

    (2)练习答案   ① 注释的作用:对程序语言进行说明,有助于开发者和用户之间的交流,方便理解程序。   ② 注释会对程序的运行产生影响嘛?        注释不是编程语句,因此被编译器忽略。不会对程序的运行产生影响。   ③ 注释的内容会存在于Java代码编译执行的哪一部分?        注释只存在于.java文件中,编译的时候会将注释全部自动删除。        如果通过反编译工具由.class得到的.java文件是没有注释内容的。

15、【键盘输入】

如果我想在Java程序中进行键盘输入,提升程序的扩展性。

需要按几个步骤进行?请写出步骤。

答:   ① 创建 扫描器 对象,获取用户的输入   ② 读取数据,读取数据的方法见下面的详细知识点   ③ 关闭

下面以int型数组为例:

public static void main(String[] args) { //Scanner类用于获取键盘输入,是一个基于正则表达式的文本扫描器 //创建 扫描器 对象,获取用户的输入 //System.in输入、System.out输出 Scanner input = new Scanner(System.in); System.out.println("输入数据:"); int n = input.nextInt(); int[] arr = new int[n]; //int等基本数据类型的数组,读取用nextInt() for(int i=0; i public static void main(String[] args) { Scanner input = new Scanner(System.in); Scanner strInput = new Scanner(System.in); int i = input.nextInt(); boolean b = input.nextBoolean(); String s = strInput.nextLine(); System.out.println(i); System.out.println(b); System.out.println(s); } }

运行结果:

二、编程基础30题 1、【回文数】

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

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

public class JavaBasic01 { public static void main(String[] args) { /* //打印所有的5位回文数 ≠ 判断一个数是否是回文数 int count = 0; //Dig_1表示个位数字,Dig_2表示十位数字,Dig_3表示百位数字 for (int Dig_1 = 1;Dig_1 < 10;Dig_1 ++) for (int Dig_2 = 0;Dig_2 < 10;Dig_2 ++) for (int Dig_3 = 0;Dig_3 < 10;Dig_3 ++){ System.out.print(Dig_1 + "" + Dig_2 + "" + Dig_3 + "" + Dig_2 + "" +Dig_1 + " "); count ++; if (count % 10 == 0) System.out.println(); } System.out.print("5位回文数的个数是:" + count + "个"); */ //另外给出 判断输入的数是否是回文数的算法 Scanner input = new Scanner(System.in); System.out.print("请输入需要判断的数(位数不限):"); int n = input.nextInt(); boolean flag = true; //或者采用num%10、num/10的循环方式,将其存入int型数组 String s = Integer.toString(n); //将输入的正整数转换成字符串 char arr[] = s.toCharArray(); //将字符串存入字符数组 for (int i = 0;i public static void main(String[] args) { System.out.print("请输入星期一、星期二、星期三、星期四。。。代表的数字:"); Scanner input = new Scanner(System.in); int num = input.nextInt(); switch (num){ case 1: System.out.print("星期一"); break; case 2: System.out.print("星期二"); break; case 3: System.out.print("星期三"); break; case 4: System.out.print("星期四"); break; case 5: System.out.print("星期五"); break; case 6: System.out.print("星期六"); break; case 7: System.out.print("星期七"); break; default: System.out.print("您输入的数字有误!"); } input.close(); } }

运行结果:

3、【if多分支-求成绩】

键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。 学生的分数取值范围[0,100] 分数大于等于90的,评级"优秀"; 分数大于等于80,小于90的,评级"良好"; 分数大于等于70,小于80的,评级"中等"; 分数大于等于60,小于70的,评级"及格"; 分数小于60的,评级"不及格";

public class JavaBasic03 { public static void main(String[] args) { System.out.print("请输入该学生的成绩:"); Scanner input = new Scanner(System.in); double score = input.nextDouble(); /* //采用 if多分支方法求求解 if(score < 60) System.out.print("该同学的成绩评级为:不及格"); else if (score < 70) System.out.print("该同学的成绩评级为:及格"); else if (score < 80) System.out.print("该同学的成绩评级为:中等"); else if (score < 90) System.out.print("该同学的成绩评级为:良好"); else if (score public static void main(String[] args) { //打印所有的三位水仙花数 ≠ 判断一个数是否是水仙花数 //与 JavaBasic01 打印所有的五位回文数相类似 for (int Dig_1 = 0;Dig_1 //另解:按照题目的提示:用这个数,遍历除以2到这个数减去1。如果能够被整除,则表明此数不是素数,反之是素数。 //下面采用的解题思路:如果一个数能被小于等于此数平方根的素数整除,则此数不是素数,否则是素数 //1不是素数,2是素数 Scanner input = new Scanner(System.in); System.out.print("请输入判断区间的下界(不包括此数):"); int min = input.nextInt(); System.out.print("请输入判断区间的上界(不包括此数):"); int max = input.nextInt(); //法一和法二的ArrayList集合定义 //List prime = new ArrayList(); //使用ArrayList集合可以很方便的直接在集合后面添加素数,而使用数组则需要找出数组中填写的最后一个元素的位置 //prime.add(2); //最小的素数是2 //法一法二主要一步是控制输出大于下界的素数,而不是全部素数。也可以在for循环中直接设置,不用设置其他变量较为发杂的做法。(思路见法三) /* //法一:通过定义标签找出第一个大于下界的数在ArrayList集合中的位置,从而使输出的素数均大于下界 boolean first = true; //用于判断是否是第一个大于下界的数 int k = 0,count = 0; for (int i = 3;i < max;i ++){ boolean flag = true; for (int j = 0;j < prime.size();j ++) { //如果一个数能被小于此数的素数整除,则此数不是素数,否则是素数 if (i % prime.get(j) == 0) { flag = false; break; } } if (flag) { prime.add(i); if (i > min) { count ++; if (first) { first = false; k = prime.indexOf(i); } } } } System.out.print("在此区间内(不包括区间的头尾两数)的素数是: "); for (;k Math.sqrt((double)i)) //如果一个数能被小于等于此数平方根的素数整除,则此数不是素数,否则是素数 break; if (i % prime.get(j) == 0 ) { flag = false; break; } } if (flag) { countAll ++; //最大值以前素数的个数加1 prime.add(i); if (i > min) { countInterval ++; //区间内的素数个数加1 } } } System.out.print("在此区间内(不包括区间的头尾两数)的素数是: "); for (int k = countAll - countInterval;k //或者上面第一个for循环中设置k初始值为0,即设置prime数组中的所有元素为true(除0、1),第二个for循环中设置i初始值为3,即这两个for循环常规写法 //然后将上面这个if语句写成 if (prime[k] == true && k > min),在输出的时候检测是否大于下界 count ++; System.out.print(k + " "); } System.out.print("\n数量是:" + count); input.close(); } }

运行结果:

6、【嵌套for循环-杨辉三角形】

打印下列图案(等腰三角形)

要求,根据键盘录入的行数,决定等腰三角形的行数。

public class JavaBasic06 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入想要打印的等腰三角形的行数:"); int num = input.nextInt(); for (int i = 1;i public static void print(int num) { for (int i = 1;i Scanner input = new Scanner(System.in); System.out.print("请输入一个整数:"); int num = input.nextInt(); print(num); input.close(); } }

运行结果:

8、【求完数】

一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完数"。

请编程求出1000 以内的所有完数。

public class JavaBasic08 { public static void main(String[] args) { int sum = 0; for (int i = 2;i public static void main(String[] args) { /*错误 outer: for (int Dig_1 = 1;Dig_1 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个正整数:"); int num = input.nextInt(); //输入的正整数 /* //采用ArrayList集合来求 int digitNum = 0; //输入的正整数的位数 List digit = new ArrayList(); //使用ArrayList集合可以很方便的直接在集合后面添加素数,而使用数组则需要找出数组中填写的最后一个元素的位置 while (num != 0) { digit.add(num % 10); digitNum ++; num /= 10; } System.out.println("您输入的正整数的位数是:" + digitNum); System.out.print("您输入的正整数的逆序是:" ); for (int element : digit) System.out.print(element); */ //使用数组来求 String s= Integer.toString(num); //将输入的正整数转换成字符串 char arr[] = s.toCharArray(); //将字符串存入字符数组 /* int digitNum = arr.length; System.out.println("您输入的正整数的位数是:" + digitNum); System.out.print("您输入的正整数的逆序是:" ); for (int i = arr.length - 1 ;i >= 0 ;i --) System.out.print(arr[i]); */ //或者将数组中的元素逆序,从头输出 int mid = arr.length / 2; for (int i = 0;i public static void main(String[] args) { int numerator = 2 , denominator = 1; //第一个数字是2/1 double result = 0; System.out.print(numerator + "/" + denominator); for (int num = 1;num public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("求前 n 个数的和,输入 n 的值(n > 0):"); int n = input.nextInt(); int sum = 0; for (;n > 0;n --) sum += n; System.out.print("和为 " + sum); input.close(); } }

运行结果:

13、【累乘】

求前n个数的积,其中n>0。

public class JavaBasic13 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("求前 n 个数积,输入 n 的值(n > 0):"); int n = input.nextInt(); int accumulate = 1; for (;n > 0;n --) accumulate *= n; System.out.print("积为 " + accumulate); input.close(); } }

运行结果:

14、【求最大值】

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

public class JavaBasic14 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请分别输入这三个数:"); int num1 = input.nextInt(),num2 = input.nextInt(),num3 = input.nextInt(); //if嵌套方式 if(num1 > num2) if(num1 > num3) System.out.println("max = " + num1); else System.out.println("max = " + num2); else if(num2 > num3) System.out.println("max = " + num2); else System.out.println("max = " + num3); //if非嵌套方式 int temp; if(num1 > num2) temp = num1; else temp = num2; if(temp > num3) System.out.println("max = " + temp); else System.out.println("max = " + num3); //三目运算符方式 //三目运算符 - 法一 //采用一个中间变量的方式 //int tempNum = (num1 > num2) ? num1 : num2; //int result = (temp > num3) ? temp : num3; //注:求最小值时,直接将上述的所有 > 全变成 < 即可 int result = num1 > num2 ?( num1 > num3 ? num1 :num3 ) : (num2 > num3 ? num2 : num3); System.out.println("max = " + result); input.close(); } }

运行结果:

15、【根据条件求数-加100/268是完全平方】

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

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

public class JavaBasic15 { public static void main(String[] args) { // //错误示例: // //逆向思维,先求出10000(10000 = 100 * 100)内大于100(100 = 10 * 10)的完全平方数,再减去100和268 // int count = 0; // //结果仍然是错误的,漏掉9933,9933 + 268 = 10201 ,是101的平方 // for (int i = 11; i * i - 100 < 10000; i++) { // System.out.print(i * i - 100 + " "); //如果for循环中判断条件是 i 0 ) { // System.out.print(i * i - 268 + " "); // count++; // if (count % 10 == 0) // System.out.println(); // } // } // System.out.print("\n在1万以内,这样的数有" + count + "个"); //正向思维 int count = 0; for (int i =1;i public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("求n以内所有的奇数和偶数和,输入n:"); int num = input.nextInt(); int oddSum = 0,evenSum = 0; for (int i = 1;i if (num == 1) return 100 / 2; return getHeight(num - 1) / 2; } //计算第 num 次落地时经过的路程(m) public static double getSum(int num) { double sum = 0; for (int i = 1;i public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("输入一个数:"); int num = input.nextInt(); int count = 0; while (num != 1) { if (num % 9 == 0) { num /= 9; count ++; } else { System.out.print("您输入的数字不能被 9 整除。"); break; } } if (count != 0) System.out.print("您输入的数字能被 " + count + " 个 9 整除。"); input.close(); } }

运行结果:

19、【判断奇偶数】

键盘录入一个in数字,判断输出它是奇数还是偶数。

public class JavaBasic19 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个整数:"); int num = input.nextInt(); if(num % 2 == 0) System.out.print("您输入的数字是偶数"); else System.out.print("您输入的数字是奇数"); input.close(); } }

运行结果:

20、【分解质因数】

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

public class JavaBasic20 { public static boolean isPrime(int num) { //采用最简单直白的方式 判断一个数是否是 素数 for (int i = 2;i //如果是素数,则直接输出 if (first) //如果用户键盘输入的数字本身是素数,则直接输出 System.out.print(num); else //否则,是分解质因数 中的一步 System.out.print(" * " + num); } else { for (int i = 2;i Scanner input = new Scanner(System.in); System.out.print("请输入一个大于2的正整数用于分解质因数:"); int num = input.nextInt(); System.out.print(num + " = "); getPrimeFactor(num); input.close(); } }

运行结果:

21、【三个数由小到大排序】

键盘输入三个整数x、y、z,请把这三个数由小到大输出。

public class JavaBasic21 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请分别输入这三个数:"); int max = input.nextInt(), mid = input.nextInt(), min = input.nextInt(); if (max //交换 max 和 min 的值 int temp = max; max = min; min = temp; } if (mid //用于判断这一个数是否是自守数 public static boolean isSelfGuardingNumber (int num) { //boolean flag = true; String s = Integer.toString(num); //将输入的正整数转换成字符串 char arr[] = s.toCharArray(); //将字符串存入字符数组 int numSquare = (int)Math.pow((double)num,2); String sSquare = Integer.toString(numSquare); char arrSquare[] = sSquare.toCharArray(); //将字符串的平方存入字符数组 for (int i = 0,j = arrSquare.length - arr.length + i;i Scanner input = new Scanner(System.in); System.out.print("请输入一个正整数:"); int max = input.nextInt(); //输出此数之前自守数的个数 int count = 0; for (int i = 0 ;i public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("您现在有多少钱(元)?"); int money =input.nextInt(); int bottleNum = 0,bottleNumAll = 0; //bottleNum记录暂时的瓶子数,bottleNumAll记录总共的瓶子数,即输出的结果 while (money >= 3) { //剩下的钱不够买饮料的 bottleNum = money / 3 ; //第一步:买20 / 3 =6瓶饮料 //第四步:买8 / 3 =2瓶饮料 //第六步:买4 / 3 =1瓶饮料 bottleNumAll += bottleNum; money = money - bottleNum *3 +bottleNum; //第二步:还剩20 - 18 +6 =8元 //第五步:还剩8 - 6 +2 =4元 //第七步:还剩4 - 3 + 1 =2元 } System.out.print("您一共可以购买 " + bottleNumAll + " 瓶饮料。"); input.close(); } }

运行结果:

25、【循环练习-蜗牛爬井】

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

public class JavaBasic25 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入井深(m):"); Double wellDepth = input.nextDouble(); /* int day = (int)((wellDepth -5) / 1.5) + ((wellDepth -5) % 1.5 == 0 ? 1:2 ); System.out.print("蜗牛需要 " + day +" 天才能从井底到爬出来。"); */ int day = 1; //蜗牛爬出井需要的天数,无论井深是多少,天数最少是1天。 double sum = 0; //蜗牛爬过的距离 while (true) { sum += 5; if (sum >= wellDepth) break; sum -= 3.5; day ++; } System.out.print("蜗牛需要 " + day +" 天才能从井底到爬出来。"); input.close(); } }

运行结果:

26、【键盘录入-求各位数之和】

键盘输入任意一个正整数,求各位数字之和。

public class JavaBasic26 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个正整数:"); int num = input.nextInt(); int sum = 0; while (num != 0) { sum += num % 10; num /= 10; } System.out.print("您输入的正整数的各位数字之和是: " + sum); input.close(); } }

运行结果:

27、【求和-去除7倍数和包含7】

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

public class JavaBasic27 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入判断区间的上界(不包括此数):"); int max = input.nextInt(); int sum = 0; //因为知道上界是三位数,也可以分别求出 个、十、百 位置上的数字 于 7 进行比较 //下面采用求素数的思想 boolean[] arr = new boolean[max]; for (int i = 0;i int temp = j; while (j != 0) { if (j % 10 == 7) //去掉包含7的数字 arr[temp] = false; j /= 10; } j = temp; } } for (int k = 1;k public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入n的值:"); int n = input.nextInt(); double result = 0; double denominator = n % 2 ==0 ? 2 :1; //如果n是偶数,第一个相加的分数的分母为2,如果n是奇数,则第一个相加的分母为1 for (double i = denominator;i //闰年是指能被4整除,但是不能被100整除的年份 或者 能被400整除的年份 //平年2月有28天,闰年2月有29天 Scanner input = new Scanner(System.in); System.out.print("请输入年份和月份:"); int year = input.nextInt(); int month = input.nextInt(); int day = 28; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 2: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) day = 29; break; case 4: case 6: case 9: case 11: break; } System.out.print("在 " + year + " 年 " + month + " 月一共有 " + day + " 天。"); input.close(); } }

运行结果:

30、【三目运算符-点餐优惠方式】

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

public class JavaBasic30 { public static void main(String[] args) { int moneyPreferential = 16 + 8 + 3; double moneyDiscount = 24 + 8 + 3 > 30 ? (24 + 8 + 3) * 0.8 : 24 + 8 + 3; double result = moneyPreferential if (month == 1 || month == 2) return 1; //第一个月和第二个月 兔子的对数均为1 ,没有出生的新兔子 return rabbit(month - 1) + rabbit(month - 2); } public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("需要打印至几月份?"); int num = input.nextInt(); for (int i =1 ;i if (people == 1) return 10; return ageFunction(people - 1) + 2; } public static void main(String[] args) { System.out.print("第五个人 " + ageFunction(5) + " 岁"); } }

运行结果:

3、【排序】

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

public class JavaExtend03 { //输出数组中的元素 public static void print(int[] arr) { //这里一定要是static for (int i = 0;i //这里一定要是static if (arr.length >= 2) { //数组长度为1时,没有必要进行排序 //不采用哨兵,数组中元素从0位置开始存放,如果采用哨兵,数组中元素从1位置开始存放,则arr[0]为哨兵 for (int i = 1; i for (int i = 0;i //若为逆序 //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; } } //3、对数组中的元素进行 快速排序 public static void Quicksort(int[] arr,int low,int high) { if (low //一趟划分 int pivot = arr[low]; //设当前表中第一个元素为枢轴,对表进行划分 while(low for (int i = 0; i //swap (arr[i],arr[min]) 交换 int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } //5、对数组中的元素进行 归并排序 public static void Mergesort(int[] arr,int low,int high) { if (low //表arr的两段A[low...mid]和arr[mid+1...high]各自有序,将它们合并成一个有序表 //Java中没有malloc对内存进行直接操作的函数,直接使用new来申请。 int[] temp = new int[arr.length+1]; //创建一个辅助数组temp int i,j,k; for (k = low;k int[] arr = getRandomArr(10); System.out.print("直接插入排序后:"); Insertsort(arr); print(arr); System.out.print("冒泡排序后:"); Bubblesort(arr); print(arr); System.out.print("快速排序后:"); Quicksort(arr,0,arr.length - 1); print(arr); System.out.print("简单选择排序后:"); Selectsort(arr); print(arr); System.out.print("归并排序后:"); Mergesort(arr,0,arr.length - 1); print(arr); //也可以采用Arrays.sort(arr)对数组进行排序 //或者采用Arrays.sort(arr,int fromIndex, int toIndex)对数组的下标从fromIndex 到 toIndex - 1进行排序,toIndex元素不参与排序。 } }

运行结果:

4、【数组元素的插入】

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

public class JavaExtend04 { //JavaBasic03中的getRandomArr(int num)方法进行部分修改 public static int[] getRandomArr(int num , int digit) { int[] arr = new int[num + 1]; //将数组的元素设置成num + 1,因为后面还要插入一个元素,设置成num会出现java.lang.ArrayIndexOutOfBoundsException:数组越界错误 int i = 0; for (;i //数组长度为1时,没有必要进行排序 //不采用哨兵,数组中元素从0位置开始存放,如果采用哨兵,数组中元素从1位置开始存放,则arr[0]为哨兵 for (int i = 1; i //这里一定要是static for (int i = 0;i //交换函数,与JavaBasic22中四、利用数组完全一样。 //定义为静态方法 //如果不定义为静态方法,则在主函数中需要依赖于对象,需要通过对象来调用 public static void swap(int[] arr,int num1,int num2){ int temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } //本题的关键在于找出给出的int数组的最大元素和最小元素 public static void main(String[] args) { int num = new Random().nextInt(10); //数组元素的个数随机生成(10以内) int[] arr = JavaExtend03.getRandomArr(num); //获取一个长度随机,元素内容随机的数组 System.out.print("随机生成的int数组是:"); JavaExtend03.print(arr); int min = 0,max = 0; //min 和 max 分别是数组中最小值的下标和最大值的下标 for (int i = 0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有