目录
Java的练习题
这是Java 中简单的练习题,通过练习去熟悉语法
判定素数
输出一个数,判断它是否是素数
什么是素数?
质数又称素数
,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)
- 第一种方法:
暴力求解
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x = 0;
for (int i = 2; i < n; i++) {
if(n % i == 0) {
x = 1;
break;
}
}
if(x == 0) {
System.out.println(n + "是素数");
}
else {
System.out.println(n + "不是素数");
}
}
Scanner 是Java 中输入的类,Scanner
类可以生成一个解析基本类型和字符串的文本扫描仪
我们可以通过 Scanner
类来获取从键盘中输入的数值
- 题解:
判断它是否是素数,我们可以同过循环的方式历遍从 2 到 n-1 之间的数字
如果 2 到 n-1 之间的数字 能被 i 整除,那么就不是素数
如果不能,结果就是素数
输出 1000 - 2000 之间所有的闰年
闰年的定义是能被 4 整除并且不能被 100 整除,或者是能被 400 整除的数
public static void main(String[] args) {
for (int i =1000; i <= 2000;i++) {
if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
System.out.println(i);
}
}
}
- 题解:
直接安照闰年定义的条件进行判断就可以了,很简单
1 到 100 的所有整数中出现多少个数字9
判断1 到 100 的数字中出现 9 的次数,99 是算 2 个
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 100; i++) {
if(i % 10 == 9) {//判断个位的9
count++;
}
if(i/10 == 9) {
count++;//判断十位的9
}
}
System.out.println(count);
}
- 题解:
首先是历遍出 1 到 100 的数字,判断条件个位的是 % 10 是否余数是 9,十位是除的余数是否是 9
二进制1的个数
求一个整数,在内存当中存储时,二进制1的个数
方法一:
暴力求解
public static void main1(String[] args) {
int n = 4;
int sum = 0;
for (int i = 0; i < 32; i++) {
if (((n >> i) & 1) != 0) {
sum++;
}
}
System.out.println(sum);
}
}
答案:1
- 题解:
二进制的位数一共是32位,循环然后和逻辑与&
1,看判断条件是否为真,为真计数器+1
方法二:
这种方法是使用 Java 种的无符号右移 >>>
public static void main(String[] args) {
int n = 5;
int count = 0;
while(n != 0) {
if( (n & 1) != 0) {
count++;
}
n = n >>> 1;
}
System.out.println(count);
}
答案:2
- 题解:
无符号右移 >>>
是无论正负数,右移的是补0,利用无符号右移 >>>
的特性,用while进行循环判断
和第一种方法类似
方法三:
效率最高
public static void main(String[] args) {
int n = 7;
int count = 0;
while(n != 0) {
n = n & (n-1);
count++;
}
System.out.println(count);
}
结果:3
- 题解:
每次让 n & n-1 的数字,二进制就会少一个1
只要计算 & 了几次就行
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
这要找规律,一除于的数是每次往上递增的,奇数的是加,偶数的是减
方法一:
public static void main2(String[] args) {
double sum = 0;
for (int i = 1; i <= 100; i++) {
if(i % 2 == 1) {
sum += 1.0 / i;
}
else {
sum -= 1.0 / i;
}
}
System.out.println(sum);
}
结果:0.688172179310195
- 题解:
之前讲过奇数的是加,偶数的是减
那么我们可以加个判断,单独的进行计算,再用一个数加起来
方法二:
public static void main(String[] args) {
double sum = 0;
for (int i = 1; i <= 100; i++) {
sum += 1.0/i;
sum = -sum;
}
System.out.println(sum);
}
- 题解:
方法二是通过方法一进行优化
由于负负得正,我们可以巧妙的通过这个方法达成想要的结果
水仙花数
求出0~n之间的所有“水仙花数”并输出
“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=13+53+3^3,则153是一个“水仙花数
public static void main(String[] args) {
for (int i = 1; i <= 999; i++) {
int x = i;
int sum = 0;
int count = 0;
while(x != 0) {
x /= 10;
count++;
}
x = i;
while(x != 0) {
sum += Math.pow(x%10,count);
x /= 10;
}
if(sum == i) {
System.out.println(i);
}
}
}
- 题解:
第一步:要先计算它是几位数,定义一个计数器,之和就是模10再除10
,计算出 i 的位数
第二步:求出每位数的次方,用一个变量加起来
Math.pow
是Java 里用来求次方的
第一个参数:输你要求什么数的次方
第二个参数:求几次方
最后就是判断所有位数加起来的次方之和
是否等于i
输出乘法口诀表
输出n*n的乘法口诀表,n由用户输入
import java.util.Scanner;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "="+ j*i + " ");
}
System.out.println();
}
}
}
- 题解:
输出n*n的乘法口诀表,n由于用户输入的
所以需要使用Scanner
,类型是nextInt
还有最后就是格式需要注意一下
模拟登陆
编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = 3;
while (count != 0) {
System.out.println("请输入密码,共有" + count + "次机会");
String pd = scan.nextLine();
if(pd.equals("123")) {
System.out.println("登陆成功");
break;
}
else {
System.out.println("登陆失败");
}
count--;
}
}
- 题解:
这题很简单,难点在于字符串的对比
Java 的字符串对比是使用equals
使用方法:变量名.equals
二进制序列
获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
public static void main(String[] args) {
int n = 7;
for (int i = 31; i >= 1; i -= 2) {
System.out.print( ((n >> i) & 1) + " ");
}
System.out.println();
for (int i = 30; i >= 0; i -= 2) {
System.out.print(((n >> i) & 1) + " ");
}
}
- 题解:
二进制是32位,使用按位于 &
个 1 就可以得出二进制位上的数字
主要的是循环条件,应该是从最高位往下,每循环一次是i -= 2
输出计算的值就可以了