JAVA大数据Week1习题

本文提供了多个编程练习,包括根据会员积分计算折扣、确定特定年月的天数、输出不同图形、实现九九乘法表、寻找水仙花数,以及解决数组操作和排序问题。此外,还探讨了如何将零移动到数组末尾,以及如何在排序后使用二分查找。这些练习涵盖了条件判断、循环、排序和搜索算法等核心编程概念。
摘要由CSDN通过智能技术生成

问题描述:

1、计算应缴金额
商场根据会员积分打折:
2000 分以内打 9 折,
4000 分以内打 8 折,
8000 分以内打 7.5 折,
8000 分以上打 7 折,使用 if-else-if 结构,实现手动输入购物金额和积分,
计算出应缴金额

代码:

package homework;

import java.util.Scanner;

public class first {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入商品的原价:");
		double price = input.nextDouble();
		System.out.println("请输入您的会员积分:");
		int integral = input.nextInt();
		
		if(integral>=8000) { //integral>=8000
			price = 0.7*price;//7折
		}else if(integral>=4000) {//4000<=integral<8000
			price = 0.75*price;//7.5折
		}else if(integral>=2000) {//2000<=integral<4000
			price = 0.8*price;//8折
		}else {//integral<2000
			price = 0.9*price;//9折
		}
		System.out.println("您应缴纳的金额为: "+price+"元");

	}

}


2、计算该年该月天数
一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为
1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平年的二月只有 28 天,而闰年的二月有 29 天,由用户在控制台输入年份和月份,
程序计算该年该月的天数。

代码:

package homework;

import java.util.Scanner;

public class second {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入你查询的年份:");
		int year = input.nextInt();
		
		System.out.println("请输入你查询的月份:");
		int month = input.nextInt();
		
		int day;
		//判断是否为闰年
		if(year%4==0 && year%100!=0 || year%400==0) {
			day = 29;	//平年的二月只有29天
		}else {
			day = 28;	//闰年的二月只有28天
		}
		
		switch(month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			System.out.println(year+"年"+month+"月只有31天");
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			System.out.println(year+"年"+month+"月有30天");
			break;
		case 2:
			System.out.println(year+"年"+month+"月有"+day+"天");
		}

	}

}


3、图形打印任务 在控制台中,编写三个 Demo,分别输出如下图形: ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021030721491426.png) 图形考查多重循环

代码:
图1代码:

package homework;

public class third {
	/**
	 * 图1
	 * 外层循环控制行数:5
	 * 内层循环控制列数:	第一行时循环1次,第二行时循环2次,第三行时循环3次,...第五行时循环5次
	 * @param args
	 */
	
	public static void main(String[] args) {
	
		for(int i=0;i<5;i++) {
			for(int j=0;j<=i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

在这里插入图片描述


图2 代码如下:

package homework;

public class third2 {

	/**
	 * 图2
	 * 外层循环控制行数:5
	 * 内层循环控制列数:	第一行时循环5次,第二行时循环4次,第三行时循环3次,...第五行时循环1次
	 * 这种与图1 是反向的,也就是内层从5开始,依次递减,每次j>i
	 * @param args
	 */
	public static void main(String[] args) {
		
		for(int i=0;i<5;i++) {
			for(int j=5;j>i;j--) {
				System.out.print("*");
			}
			System.out.println();
		}

	}

}

在这里插入图片描述

图3 代码如下:

package homework;

public class third3 {

	/**
	 * 图2
	 * 外层循环控制行数:5
	 * 内层循环控制列数:	第一行时循环1次,第二行时循环3次,第三行时循环5次,第四行时循环7次,第9行时循环1次
	 * 也就是内层的j<2*i+1,但是每次都是空格先出现,而*是后边才出现
	 * 空格循环控制列数:	第一行前面4次,第二行前面3次,第三行前面2次,第4行前面1次;比i少了1次
	 * @param args
	 */
	public static void main(String[] args) {
		
		for(int i=0;i<5;i++) {
			for(int x=i+1;x<5;x++) {
				System.out.print(" ");
			}
			for(int j=0;j<2*i+1;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

	}

}


在这里插入图片描述

4、打印九九乘法表 ,效果如图:
在这里插入图片描述
代码如下:

package homework;

public class quarter {

	/**
	 * 9x9乘法表
	 * j<=i
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("乘法口诀表:");
		for(int i=1;i<=9;i++) {
			for(int j=1;j<=i;j++) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}

	}

}

在这里插入图片描述

5、打印三位数中的所有水仙花数
所谓“水仙花数”即一个整数满足其值等于各个数位的立方和。
如: 153 是一个水仙花数,因为 153= 1³+5³+3³

考查位数
代码如下:

package homework;

public class fifth {
	
	/**
	 * 考查位数
	 * 三位数,求每个位的数,使用余数和除数
	 * 三位数的范围:100~999
	 * @param args
	 */
	public static void main(String[] args) {
		shuiXianHua();

	}
	
	public static void shuiXianHua() {
		int a = 0;
		int b = 0;
		int c = 0;
		for(int i=100;i<1000;i++) {
			a=i/100;
			b=(i%100)/10;
			c=(i%100)%10;
			if((a*a*a+b*b*b+c*c*c) == i) {
				System.out.print(i+" ");
			}
		}
	}

}

在这里插入图片描述
人工智能的概念刚兴起时,网上流传了一段价值一个亿的代码,如下图:
在这里插入图片描述
代码如下:

import java.util.Scanner;

public class AI {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String question;
		while(true) {
			question = scanner.next();
			question = question.replace("吗","");
			question = question.replace("我","我也");
			question = question.replace("?", "!");
			System.out.println(question);
		}

	}

}

在这里插入图片描述
今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举
一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的
规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),
凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
请你通过编写程序,求出一组人中的队长是原来第几位同学。

import java.util.Scanner;

public class dengshan {
	
	/**
	 * 思路:
	 * 	1.先将所有人定义成一个Boolean型数组,初始值为true,报到3的人变成false
	 * 	2.定义剩余人数,初始报数为1,并计算已经报完的人数
	 *  3.当已经报完人数和剩余人数相等时,说明一圈结束,开始新的循环,计数归0,最好输出值为true的人,即为队长
	 * @param args
	 */
	public static void main(String[] args) {
		int total;	//定义总人数
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入围成一圈的人数");
		total = scanner.nextInt();
		
		boolean nums[] = new boolean[total];
		for(int i=0;i<total;i++) {
			nums[i] = true;	//给每个人都赋值为true
		}
		
		int leftNum = total;	//剩余人数
		int numN = 0;	//开始报数
		int index = 0;	//计数
		
		while(leftNum > 1) {
			if(nums[index] == true) {
				numN ++;
				if(numN == 3) {
					numN = 0;	//重新报数,归0
					nums[index] = false;//当然该索引的位置置为false,表示不存在了
					leftNum--;//剩余的人数自然减一
				}
			}
			index++;	//索引往后移动
			if(index == total) {
				//如果所有人都遍历后,则重新开始
				index = 0;
			}
		}
		
		//找出队长
		for(int i=0; i<total; i++) {
			if(nums[i] == true) {
				//找出剩下的人
				System.out.println("队长是原来第"+(i+1)+"位同学");
			}
		}
		

	}

}

在这里插入图片描述
在这里插入图片描述
1、查找某个整数
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输
入一个整数,查找此整数,找到输出下标, 没找到给出提示。

import java.util.Scanner;

public class num1 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int[] nums = new int[10];
		System.out.println("请输入10个整数数字: ");
		for(int i=0;i<nums.length;i++) {
			nums[i] = input.nextInt();
		}
		
		System.out.println("请输入你要查找的一个整数数字: ");
		
		int index = input.nextInt();
		int i=0;
		while(i<nums.length) {
			if(nums[i] == index) {
				System.out.println("该整数位于数组下标为"+i+"的位置");
			}
			if(nums[i] != index) {
				System.out.println("数组下标为"+i+"的位置没有找到!");
			}
			i++;
		}
		

	}

}

2、找出数组的最值
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组
的最大值、最小值。

import java.util.Scanner;

public class num2 {

	/**
	 * 考查双目运算 : 
	 * 最大值		n = n>nums[i]?n:nums[i];
	 * 最小值		n = n<nums[i]?n:nums[i];
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		//定义长度为10的整型数组,循环输入10个整数
		System.out.println("请输入10个整数: ");
		int[] nums = new int[10];
		for(int i=0;i<nums.length;i++) {
			nums[i] = input.nextInt();
		}
		
		//定义最大值,最小值
		int maxIndex = nums[0];
		int minIndex = nums[0];
		for(int i=0;i<nums.length;i++) {
	
				maxIndex = (maxIndex>nums[i])?maxIndex:nums[i];
				minIndex = (minIndex<nums[i])?minIndex:nums[i];

		}
		System.out.println("该数组的最大值为: "+maxIndex);
		System.out.println("该数组的最小值为: "+minIndex);
		

	}

}

在这里插入图片描述
3、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为
目标值的那两个整数,并输出他们的数组下标
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1


public class num3 {
	
	/**
	 * 考查: 条件语句和逻辑运算
	 * @param args
	 */
	public static void main(String[] args) {
		
		int[] nums = {2,7,11,15};
		int target = 9;
		
		for(int i=0;i<nums.length;i++) {
			for(int j=1;j<nums.length;j++) {
				if(nums[i] + nums[j] == target && i!=j) {
					System.out.println(i+","+j);
				}
			}
		}

	}

}

在这里插入图片描述

4、排序并查找
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并
输出排序后的下标。

import java.util.Scanner;

public class num4 {
	
	/**
	 * 
	 * 考查: 冒泡排序和二分查找(折半查找)
	 * @param args
	 */
	public static void main(String[] args) {
		
			int[] nums = {1,3,9,5,6,7,15,4,8};
			
			//冒泡排序
			int temp;
			//内层层循环控制:	比较的轮数
			//外层循环次数:	length-1
			for(int i=0;i<nums.length-1;i++) {
				
				//内层循环控制:	每轮比较的次数
				//第i轮 (i从0开始计算),	比较次数为: length -i-1
				for(int j=1;j<nums.length-i-1;j++) {
					//两两比较,	满足移动条件
					if(nums[j]>nums[j+1]) {
						temp = nums[j];
						nums[j] = nums[j+1];
						nums[j+1] = temp;
					}
				}
			}
			System.out.println("经过排序后各数据的具体情况: ");
			for(int i=0;i<nums.length;i++) {
				System.out.println("下标:"+i+",具体数据:"+nums[i]);
			}
			
			//二分查找
			
			//要查找的数据
			Scanner input = new Scanner(System.in);
			System.out.print("请输入要查找的数据: ");
			int num = input.nextInt();
			
			//1. 最小范围下标
			int minIndex = 0;
			//2. 最大范围下标
			int maxIndex = nums.length-1;
			//3. 中间数据下标
			int centerIndex = (minIndex+maxIndex)/2;
			
			while(true) {
				if(nums[centerIndex] > num){
					//中间数据较大
					maxIndex = centerIndex-1;
				}else if(nums[centerIndex] < num) {
					minIndex = centerIndex+1;
				}else {
					//找到了数据,正好minIndex=maxIndex=centerIndex
					break;
				}
				
				//查找的数据并不存在的情况
				if(minIndex > maxIndex) {
					centerIndex = -1;
					break;
				}
				
				//当边界发生变化时,	需要更新中间下标
				centerIndex = (minIndex+maxIndex)/2;
			}
			
			System.out.println("该数据的下标为: "+centerIndex);
			

	}

}

在这里插入图片描述

5、移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保
持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]


public class num5 {
	
	/**
	 * 
	 * 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 
	 * 考查:	排序
	 * 思路: 冒泡排序&&逻辑语句
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		int[] nums = {0,1,0,3,12};
		
		int temp;
		//
		for(int i=0;i<nums.length-1;i++) {
			
			//内层控制循环:每轮比较的次数
			for(int j=0;j<nums.length-i-1;j++) {
				if(nums[j] < nums[j+1]) {
					temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
				
				//冒泡从0开始排序,保证非零的数据相对位置不变
				//第一次冒泡排序就可以将1提到下标为0的位置
				//经过第一次冒泡排序后,零的数据就位于下标为1,2的位置.
				//当非零数据排完后就将零的数据输出
				if(j == 2 && i == 1) {
					for(int k=0;k<nums.length;k++) {
						System.out.print(nums[k]);
						System.out.print(" ");
					}
				}
			}
		}

	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

低调的小哥哥

你的关注就是我为你服务的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值