目录
1. 第一题
2. 判定一个数字是否是素数
3. 打印 1 - 100 之间所有的素数
4. 输出 1000 - 2000 之间所有的闰年
5. 输出乘法口诀表
6. 求两个正整数的最大公约数
7. 求二进制中 1 的个数
8.分别输出二进制中的奇数位和偶数位
下面的源码大多只有方法体,需要自己补全类之后才能用
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)+" ");
}
}
本节完…………………………………………