Java练习题(经典8题)

题目一

共有50枚硬币,可能包括4种类型:1元,5角,1角,5分。已知总价值为20元。求各种硬币的数量。

解题思路:简单分析可知硬币有多种组合,我们可以假设先抛开50枚硬币去寻找1元需要多少个硬币(明显是20个就满足),5角(40个),1角(200个),5分(400个)。最后我们在最内层循环加上50枚硬币的条件即可。

public class Test1 {
    public static void main(String[] args) {
        //寻找5分钱
        for (int i = 0; i <= 400; i++) {
            //寻找1角钱
            for (int j = 0; j <= 200; j++) {
                //寻找5角钱
                for (int k = 0; k <= 40; k++) {
                    //寻找1元
                    for (int l = 0; l <= 20; l++) {
                        if (i * 5 + j * 10 + k * 50 + l * 100 == 2000 && i+j+k+l == 50){
                            System.out.println(i+"个5分"+j+"个1角"+k+"个5角"+l+"个1元");
                        }
                    }
                }
            }
        }
    }
}

题目二

        鸡兔同笼问题:鸡兔一共35只,笼子里脚共有94只,请问分别有多少只鸡和多少只兔子。

解题思路:因为Java的特性变量必须要初始化,所以二元一次方程组的解法就不灵了,我们可以假设最开始鸡只有0只,进行for循环从1加到35

public class Test2 {
    public static void main(String[] args) {
        for (int chick = 1; chick <= 35; chick++) {
            //记录兔子的数量(利用脚的数量算出兔子的数量)
            int rabbit = (94 - chick * 2) / 4;
            //如果遍历到兔子的数量加上鸡的数量等于总数量就可以break啦
            if (chick + rabbit == 35){
                System.out.println("鸡有" + chick + "只");
                System.out.println("兔有" + rabbit + "只");
                break;
            }
        }
    }
}

题目三

        求1-2022有多少个质数(只有1和它本身两个因数)。

        这题虽然简单但是第一见到不一定写的出来,有一些细节需要注意,比如count - 1 

public class Test3 {
    public static void main(String[] args) {
        //记录数量
        int count = 0;
        for (int i = 1; i <= 2022; i++) {
            //用于判断是否为质数
            boolean isSum = true;
            //从2到根号i寻找数字并判断能否被整除
            //因为因数是成对存在的,如果i从2到根号i之间都没有因数
            //那么在根号i之后也没有因数
            for (int j = 2; j <= Math.sqrt(i); j++) {
                //如果能被整除表明不是质数,就可以break
                if (i % j == 0){
                    isSum = false;
                    break;
                }
            }
            //遍历完1-2022所有数字,判断有多少个true(用count记录)
            if (isSum){
                count++;
            }
        }
        //因为1不是质数是整数,这里需要-1
        System.out.println(count - 1);
    }
}

题目四

        求两个数的最大公约数(两个数中存在一个最大同时被两个数整除),最小公倍数(两个数拥有最小并相同的倍数)。

         这题虽然也简单,但是第一次遇到还是挺难写出来的。

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num1 = scanner.nextInt();
        int num2 = scanner.nextInt();
        //求最大公约数,需要定义临时变量
        int temp = 0;
        while (true){
            //不断取余寻找因数
            temp = num1 % num2;
            //将因数赋给num1
            num1 = num2;
            //将num2置为余数
            num2 = temp;
            //直到余数为0,此时的num1就是最大公约数
            if (num2 == 0){
                System.out.println("最大公约数是" + num1);
                break;
            }
        }
        //num1 num2的值已经发生改变,这里定义新变量计算最小公倍数
        int num3 = scanner.nextInt();
        int num4 = scanner.nextInt();
        //先找出num3,num4之间的最大数
        temp = Math.max(num3,num4);
        //在两数最大到两数乘积之间寻找最小公倍数
        for (int i = temp; i <= num3 * num4; i++) {
            //公倍数条件
            if (i % num3 == 0 && i % num4 == 0){
                System.out.println("最小公倍数是" + i);
                //找到的第一个满足条件的数就是最小公倍数
                break;
            }
        }
    }
}

题目五

        打印九九乘法表

对于刚接触的小伙伴来说可能是有难度的,这里我们可以换一个需求先实现打印9个*********

System.out.print("*********")[这个属于犯规],正确的是:
    for (int i = 0; i < 10; i++) {
            System.out.print("*");
        }

我们再提高要求实现:

*
**
***
****
*****
******
*******

        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

如果看不懂没关系,这段代码可以拆分成以下代码

        for (int i = 0; i < 1; i++) {
            System.out.print("*");
        }
        System.out.println();
        for (int i = 0; i < 2; i++) {
            System.out.print("*");
        }
        System.out.println();
        for (int i = 0; i < 3; i++) {
            System.out.print("*");
        }
        System.out.println();
        for (int i = 0; i < 4; i++) {
            System.out.print("*");
        }
        System.out.println();
        for (int i = 0; i < 5; i++) {
            System.out.print("*");
        }
        System.out.println();
        for (int i = 0; i < 6; i++) {
            System.out.print("*");
        }

 所以最终的代码就是这样:

public class Test5 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                //\t是为了好看
                System.out.print(i + "*" + j + "=" + i * j + "\t");
            }
            System.out.println();
        }
    }
}

 题目六

        有一个n*m的棋盘,现在对这个棋盘进行黑白染色,左上角染成黑色。从左上角开始,每个黑色格的相邻格染成白色,白色格的相邻格染成黑色。
以下给出了一个5*7的棋盘的染色示例。
给定n和m,请问棋盘上一共有多少方格被染成了黑色。

题目的意思大概是这样。

解题思路:这里需要利用二维数组来理解这题,我们可以假设1就是黑色,0就是白色。然后再遍历这个二维数组,遇到1我们就计数

 这段代码可以帮助理解解题思路:

public class Test6 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int[][] arr = new int[n][m];
		int count = 0;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m ; j++) {
				//奇数行的规律
				if(j % 2 == 0 && i % 2 == 0) {
					//表示黑色
					arr[i][j] = 1;
				}
				//偶数行的规律
				else if(i % 2 != 0 && j % 2 != 0){
					//表示黑色
					arr[i][j] = 1;
				}
			}
		}
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				if(arr[i][j] == 1) {
					count++;
				}
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println(count);
		scanner.close();
	}

}

其实我们在"上色的时候就可以计数了",所以代码可以简化一下(省略上色):

public class Test6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] arr = new int[n][m];
        int count = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m ; j++) {
                //奇数行的规律
                if(j % 2 == 0 && i % 2 == 0) {
                    count++;
                }
                //偶数行的规律
                else if(i % 2 != 0 && j % 2 != 0){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

题目七

        在1至2022中,有多少个数的数位中包含数字9?
  注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。

解题思路:把1-2022转换字符串,再利用indexOf方法判断。

String.valueof()方法:将int类型转换成String类型。

str.indexOf()方法:返回指定子字符串在此字符串中第一次出现处的索引,如果没有返回-1。

public class Test7 {
    public static void main(String[] args) {
        //记录数量
        int count = 0;
        for (int i = 1; i <= 2022; i++) {
            //将整数i转换成字符串
            String str = String.valueOf(i);
            //利用String类的indexOf方法
            //返回指定子字符串在此字符串中第一次出现处的索引,如果没有返回-1。
            if (str.indexOf("9")!=-1){
                    count++;
            }
        }
        System.out.println(count);
    }
}

题目八

        判断水仙花数,例如153 = 1*1*1 + 5*5*5 + 3*3*3

        求1-2022有多少个水仙花数

解题思路:关键就是表达个位,百位,千位的数。

public class Test8 {
    public static void main(String[] args) {
        //记录个数
        int count = 0;
        for (int i = 1; i <= 2022; i++) {
            //表示个位
            int bits = i % 10;
            //表示十位
            int ten = i / 10 % 10;
            //表示百位
            int hundred = i / 100 % 10;
            //水仙花数条件
            if(bits * bits * bits + ten * ten * ten + hundred * hundred * hundred == i){
                count++;
            }
        }
        System.out.println(count);
    }
}

有错误欢迎指出!

  • 28
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号三;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值