下面的源码大多只有方法体,需要自己补全类之后才能用
1. 第一题
(1)题目
根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)
(2)本题思路
- 这里使用的:是Java当中的,从键盘输入数据的方式,固定格式。其中age是变量的名字,scanner是工具包的名字。
import java.util.Scanner;//导入的包 Scanner scanner = new Scanner(System.in);//工具 int age = scanner.nextInt();//从键盘输入年龄
- 这题一看,就是多分支结构,并且每个选项是有范围的,所以想到if的多分支结构
if(age<=18) { System.out.println("少年"); } else if(age >= 19 && age<=28) { System.out.println("青年"); } else if(age>=29 && age<=55) { System.out.println("中年"); } else { System.out.println("老年"); }
(3)完整代码
import java.util.Scanner;//导入的包 public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);//工具 int age = scanner.nextInt();//从键盘输入年龄 if(age<=18) { System.out.println("少年"); } else if(age >= 19 && age<=28) { System.out.println("青年"); } else if(age>=29 && age<=55) { System.out.println("中年"); } else { System.out.println("老年"); } scanner.close();//关闭工具 } }
2. 判定一个数字是否是素数
(1)了解素数
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
(2)思路
- 代码判断素数的写法:ret就是需要判断是否为素数,只需要拿i=2到i=根号ret来判断即可(一种方法)
boolean tmp = true; while(i<=Math.sqrt(ret)) { if(ret%i==0) { System.out.println(ret+"不是素数"); tmp = false; break; } i++; }
- 导致循环结束的两种条件:不是素数提前跳出;是素数循环结束。所以需要拿一个值去标记一下:tmp
- 如果值没有被修改,那就是素数,并打印
if(tmp) { System.out.println(ret+"是素数"); }
(3)完整代码
import java.util.Scanner;//导入的包 public class Test { public static void main(String[] args) {//判断素数 Scanner scanner = new Scanner(System.in); int ret = scanner.nextInt(); int i=2; boolean tmp = true; while(i<=Math.sqrt(ret)) { if(ret%i==0) { System.out.println(ret+"不是素数"); tmp = false; break; } i++; } if(tmp) { System.out.println(ret+"是素数"); } scanner.close();//关闭工具 } }
3. 打印 1 - 100 之间所有的素数
(1)思路
本体是在第二题的基础上改造,也就是在外层套上一个循环即可,用来输出1-100的数字;要注意ret++的操作
(2)完整代码
public static void main(String[] args) {//判断素数 int ret = 2; while(ret<=100) { int j=2; boolean tmp = true; while(j<=Math.sqrt(ret)) { if(ret%j==0) { tmp = false; break; } j++; } if(tmp) { System.out.println(ret+"是素数"); } ret++; }
4. 输出 1000 - 2000 之间所有的闰年
(1)判断闰年的方法
闰年有两种:
- 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
- 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
所以代码写法:只需要将判断条件写在一起即可
if(year%400==0||(year%100!=0&&year%4==0)) { System.out.println(year); }
(2)完整代码
public static void main6(String[] args) { //输出1000-2000之间的闰年 int year = 1000; while(year<=2000) { if(year%400==0||(year%100!=0&&year%4==0)) { System.out.println(year); } year++; } }
5. 输出乘法口诀表
(1)了解乘法口诀表
这就是乘法口诀表的性质和特点,里面的表格就需要我们去考虑了。
(2)思路
- 我们可以发现,这可以想象成一个“二维数组”,肯定就是需要两个for循环来输出的。细节在于第二个循环:j<=i;
for(i=1;i<=9;i++) { int j=1; for(j=1;j<=i;j++) { System.out.print(i+"*"+"="+(i*j)+" "); } System.out.println(); }
- 打印格式:分别需要输出i,j,i*j还有空格,第二层循环结束再换行
System.out.print(i+"*"+"="+(i*j)+" ");
(3)完整代码
public static void main(String[] args) { //输出九九口诀表 int i=1; for(i=1;i<=9;i++) { int j=1; for(j=1;j<=i;j++) { System.out.print(i+"*"+"="+(i*j)+" "); } System.out.println(); } }
6. 求两个正整数的最大公约数
(1)介绍最大公约数
概念:公约数是可以同时整除两个数,公约数最大的那个就是最大公约数,如:4是12与16的最大公约数,12/4==0且16/4==0,比4大的就不能整除他们俩
特点:一定<=他们之间最小的
(2)常规方法
- 找最小值
int a = 12; int b = 16; int min=a>b?b:a;//找最小值
- 找最大公约数:从最小值开始往下找 ,满足条件即是最大公约数
while(min>=1) { if(a%min==0&&b%min==0) { break; } min--; }
- 完整代码
public static void main(String[] args) { //求最大公因数 int a = 12; int b = 16; int min=a>b?b:a;//找最小值 while(min>=1) { if(a%min==0&&b%min==0) { break; } min--; } System.out.println("最大公约数是:"+min); }
(3)辗转相除法
- 了解辗转相除法的做法(具体原理是什么我也不是很清楚)
用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。
- 辗转的过程
- 完整代码
public static void main(String[] args) { //求最大公因数 int a = 12; int b = 16; int c = a%b; while(c!=0) { a = b; b = c; c = a%b; } System.out.println("最大公约数:"+b); }
7. 求二进制中 1 的个数
(1)了解题目要求
如:7,二进制为00000111(只展示8位),1的位数共有3,所以需要求出3
(2)常规方法
思路:
- 符号按位与(&),对应位上都是1结果为1,其他为0。所以可以使用和1按位与,可以确定最低位是否为1
- 按位与一次只能得到最低位,所以配合无符号右移符号(>>>)可以完成每一位的检查。
- 选择无符号右移的原因:右移之和左边会补符号号,负数的话则会补1
if(((a>>>i)&1)==1) { sum++; }
完整代码:
public static void main(String[] args) { //求二进制中1的个数 int a = -1; int sum = 0; int i = 0; for(i=0;i<32;i++) { if(((a>>>i)&1)==1) { sum++; } } System.out.println(sum); }
(3)快速法
原理(举例说明):
完整代码:
public static void main(String[] args) { //求二进制中1的个数 int n = 7; int i = 0; while(n!=0) { n=n&(n-1); i++; } System.out.println(i); }
8.分别输出二进制中的奇数位和偶数位
(1)题目意思
如:7的二进制为:00000000 00000000 00000000 00000111
奇数位(标红的数字):10101010 111010101010101 01000111
偶数位(标黑的数字):10101010 111010101010101 01000111
(2)思路
- 同样让最低位与1进行按位与操作,原数是0则是0,1则是1
- 每次需要右移两位(跳过奇数位或者偶数位)
- 分两个循环分别输出奇数位跟偶数位
(3)完整代码
public static void main(String[] args) { int n = 7; int i=0; //获取奇数位 System.out.print("奇数位:"); for(i=30;i>=0;i-=2) { System.out.print(((n>>>i)&1)+" "); } System.out.println(); System.out.print("偶数位:"); for(i=31;i>=1;i-=2) { System.out.print(((n>>>i)&1)+" "); } }
本节完…………………………………………