基础问答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 += b
和 a = a + b
的区别:
a += b
如果两边的操作数的精度不一样时会自动向低转化。
a = a + b
则不会自动转化,需要手动进行强制类型转化。
8.【浮点数】float a = 0.1F;
和double b = 0.1;
这两条语句定义的浮点数a
和b
,请问它们相等嘛?为什么?
答:不相等。
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 _
mainclass
13.【标识符命令规范】标识符的命名除了语法要求外,更重要的是符合约定俗成的规范。下列标识符的字符串组成,都是符合语法要求的,请问**哪些是符合约定俗成命名规范的?哪些不符合?**请在这道题下面附上符合约定俗成规范的Java标识符命名规范。(根据不同语法结构给出)
答:
类名:
demotestStudentStudent_
program1MYDemomyDemoXueSheng变量名:
age
nianLing 能用单词应该用单词
myName
_name
Variable包名:
com.baidu
Com.Baidubao.ceshi
注:标识符命名规范相当重要,请大家查阅老师给的文档,先自行学习!
命名规则:
- 包:
包类似于操作系统中以文件夹的形式组织文件。
在JAVA语言中,以包来组织JAVA中的类,不同包下可以包含同名的类名。
为了包名的唯一,通常以域名反转的方式来命名包,例:com.baidu.www。
多级包: 以域名(是唯一的)反转的方式来命名包,单词全部小写。
单极包: 一个全部小写的单词。如 test
- 类和接口:
单个:首字母大写,其余字母全部小写。如 Student
多个单词:多个单词的首字母均大写,其余字母全部小写 。如:JavaBasic 、MaxAge
- 变量和方法:
单个:所有字母小写。 如:value
多个单词:第一个单词首字母小写,从第二个开始,每个单词首字母大写。 如:intValue
- 常量:
所有单词字母都大写。如MAX
多个单词:单词之间用_来分割,如MAX_AGE
14.注释的作用是什么?注释会对程序的运行产生影响嘛?注释的内容会存在于Java代码编译执行的哪一部分?
答:
注释的作用:对程序语言进行说明,有助于开发者和用户之间的交流,方便理解程序。
注释不是编程语句,因此被编译器忽略。不会对程序的运行产生影响。
注释只存在于.java文件中,编译的时候会将注释全部自动删除 还有#开头的。
15.如果我想在Java程序中进行键盘输入,提升程序的扩展性。需要按几个步骤进行?请写出步骤
答:
1 . 工具包导包 创建扫描器对象,获取用户的输入
-
读取数据,读取数据的方法见下面的详细知识点
-
关闭
编程基础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();
}
}