1.19 java笔记

共两个部分:

把一个整数分解一个质因数

不得不说,我一开始不晓得什么是质因数。我居然跑去补数学了。笑死我了。
简单来说就是:

  • 名称等价:
    • 质因数 = 质因子 = 素因数
    • 质数 = 素数
    • 因数 = 约数

确定记住,那么往下看:

  • 定义:
    • 质因数: 能整除给定一个正整数的素数,即一个正整数的约数,但该约数又是质数
    • 因数:整数a/b没有余数(b≠0),则b为a的因数。 特 别 地 ‾ \underline{特别地} ,0不是0的因数
    • 质数:大于1的自然数中,除了1和它本身不再有其他因数,质数有无限个
    • 特别地,1没有质因子,1与其他任何数都互质
    • 互质:除1以外,两个没有其他共同质因子的正整数
  • 只有一个质因子的正整数为质数

好像也还好。

然后补充一个图片,图片来源网站,源地址找不到了,在贴吧看到的,没有保存,借用下啊,仅供个人学习用。
质因子范围
得到的结论是如果一个数N有质因子,那么质因子 <= N \sqrt{N} N ,我们可以减少循环次数,提高效率。
这里的根号打印参考这篇文章:markdown数据公式整理
参考文档:
1.质数因数
2.百度百科-质因数
源码:

package chap2;

import java.util.Scanner;


public class PrimeFactor {
/**
 * 将一个正整数分解成质因数
 * author:黄浩
 * time:2021年1月18日16:30:35
 * @param args
 */
	public static void main(String[] args) {
		System.out.println("请输入一个整数:");
		Scanner sc =new Scanner(System.in);
		int num = sc.nextInt();
		factor(num);
		
	}
/**
 * 分解质因数
 * @param num
 */
private static void factor(int num) {
	System.out.println("分解结果为:");
	for (int i = 2; i < Math.sqrt(num); i++) {//质因数范围
		if (num % i == 0) {
			System.out.print(i+"*");
			num /= i;
			//i = 2;//也可以重新赋值
			i--;//整除不改变i的值
		}
	}
	System.out.println(num);
}

}

代码参考文档:质因数分解

快递柜

这个主要是菜单循环,还有方法抽象,没有什么逻辑特别复杂的,细心点就可以了,可能比较要思考的就是那部分代码可以抽象出来复用,以减少代码的冗余,从而达到高内聚低耦合。实现方式目前是以数组存下的,之后看看写入文件来保存数据试试。
注意以下:
1.

函数描述
Math.random()生成一个随机数,double,范围在[0,1)之间

2.菜单用到switch语句,说下使用注意事项:

1.switch()中必须用变量,类型必须是byte,char,short,int,enum中的一种,不可以是long,case后面必须是常量;

  • 之前想在case里做值判断,报错了

2.因此只能用来做等值判断,区间判断就用if-else…
3.break语句一般不省略,避免穿透现象导致多个case同时发生,但如果确定多个值对应同一只情况则可以使用,如文件更新补丁包(这里不大清楚,没做过)
4.default语句一般省略,用于对不满足所有case情况时
5.为了避免case同名变量冲突现象,要不将每个case封装成单独的方法要不单独加上大括号表示分隔

源码:(部分代码可能有轻微重复,没有再细致去修改了)

package chap2;

import java.util.Scanner;

public class DeliveryLocker {
	/**
	 * 快递柜 (数组实现)
	 * author:黄浩 
	 * time:2021年1月18日17:46:27
	 * @param args
	 */
	static Scanner sc = new Scanner(System.in);
	static int[] deliveryNum = new int[10];// 快递单号
	static String[] companyName = new String[10];// 快递公司名称
	static int[] pickUpCode = new int[10];// 取件码
	static boolean flag = true;// 退出标志

	public static void main(String[] args) {
		do {
			System.out.println("=====欢迎使用快递柜=====");
			System.out.println("快递单号为整型数字");
			System.out.println("请输入你的身份:1.快递员 2.用户 3.退出");
			int identity = sc.nextInt();
			switch (identity) {
			case 1:
				courier();
				break;
			case 2:
				user();
				break;
			case 3:
				System.out.println("再见");
				flag = false;
				break;
			default:
				System.out.println("输入不合法,请检查!");
				break;
			}
		} while (flag);
	}
/**
 * 用户取件
 */
	private static void user() {
		do {
			System.out.println("请输入取件码:-1.退出取件");
			int code = sc.nextInt();
			if (code == -1) {
				break;
			}
			if (pickUp(code) != -1) {
				setDefault(pickUp(code));
				System.out.println("取件成功");
			} else {
				System.out.println("无效的取件码");
			}
		} while (true);
	}

	/**
	 * 设置为默认值
	 * 
	 * @param pickUp
	 */
	private static void setDefault(int index) {
		deliveryNum[index] = 0;
		companyName[index] = null;
		pickUpCode[index] = 0;

	}

	/**
	 * 找到取件码的位置
	 * 
	 * @param code
	 * @return
	 */
	private static int pickUp(int code) {
		for (int i = 0; i < pickUpCode.length; i++) {
			if (pickUpCode[i] == code) {
				return i;
			}
		}
		return -1;
	}
/**
 * 快递员菜单
 */
	private static void courier() {
		courierMenu: do {
			System.out.println("请输入操作:1.存快递 2.删除快递 3.修改快递信息 4.查看所有快递信息 -1.返回上层");
			int manipulate = sc.nextInt();
			switch (manipulate) {
			case 1:
				depositExpress();
				break;
			case 2:
				delExpress();
				break;
			case 3:
				updateExpress();
				break;
			case 4:
				showAllExpressInfo();
				break;
			case -1:
				break courierMenu;
			default:
				System.out.println("输入有误,请重新输入!");
				break;
			}
		} while (true);

	}
/**
 * 展示所有的快递信息
 */
	private static void showAllExpressInfo() {
		System.out.println("所有快递信息如下:");
		System.out.println("快递单号\t公司名称\t取件码");
		for (int i = 0; i < deliveryNum.length; i++) {
			if (deliveryNum[i] != 0) {
				System.out.println(deliveryNum[i] + "\t\t" + companyName[i] + "\t\t" + pickUpCode[i]);
			}
		}

	}
/**
 * 更新快递信息
 */
	private static void updateExpress() {
		System.out.println("请输入要修改的快递单号");
		int modify = sc.nextInt();
		int index = findLocationByDeliveryNum(modify);
		if (index >= 0) {
			System.out.println("请输入新的快递单号");
			int num = sc.nextInt();
			System.out.println("请输入新的快递公司");
			String comp = sc.next();
			int code = generateCode();
			saveInfo(num, comp, code, index);
			System.out.println("修改成功");
		} else {
			System.out.println("没有找到对应的快递");
		}
	}
/**
 * 删除快递信息
 */
	private static void delExpress() {
		int delNum = getDeliveryNumByUserInput();
		int index = findLocationByDeliveryNum(delNum);
		if (index >= 0) {
			setDefault(index);
			System.out.println("删除成功!");
		} else {
			System.out.println("输入单号不存在,删除失败");
		}
	}

	/**
	 * 查找到指定元素 通过单号
	 * @param delNum
	 * @return
	 */
	private static int findLocationByDeliveryNum(int delNum) {
		for (int i = 0; i < deliveryNum.length; i++) {
			if (deliveryNum[i] == delNum) {
				return i;
			}
		}
		return -1;
	}
/**
 * 存快递
 */
	private static void depositExpress() {
		if (findLocation() >= 0) {// 是否有空间
			int newNum = getDeliveryNumByUserInput();// 获取用户输入
			if (!hasDuplicate(newNum)) {
				String newComp = getCompanyNameByUserInput();
				int newCode = generateCode();
				saveInfo(newNum, newComp, newCode, findLocation());
				System.out.println("添加成功");
			} else {
				System.out.println("单号已存在,请更改单号重新存入,本次存入失败。");
			}
		} else {
			System.out.println("空间已满,存入失败!");
		}
	}

	/**
	 * 存入数据
	 * 
	 * @param newNum
	 * @param newComp
	 * @param newCode
	 * @param findLocation
	 */
	private static void saveInfo(int newNum, String newComp, int newCode, int index) {
		deliveryNum[index] = newNum;
		companyName[index] = newComp;
		pickUpCode[index] = newCode;
	}

	/**
	 * 生成随机数作为取件码
	 * [0,1000)之间
	 * @return
	 */
	private static int generateCode() {
		return (int) (Math.random() * 900 + 100);
	}

	/**
	 * 找到插入位置
	 * 
	 * @return
	 */
	private static int findLocation() {
		for (int i = 0; i < deliveryNum.length; i++) {
			if (deliveryNum[i] == 0) {
				return i;
			}
		}
		return -1;
	}

	/**
	 * 查重
	 * 
	 * @param newNum
	 * @return
	 */
	private static boolean hasDuplicate(int newNum) {
		for (int i = 0; i < deliveryNum.length; i++) {
			if (deliveryNum[i] == newNum) {
				return true;
			}
		}
		return false;
	}

///**
// * 判断数组是否空间
// * @param deliveryNum2
// * @return
// */
//private static boolean hasRoom(int[] a) {
//	for (int i = 0; i < a.length; i++) {
//		if (a[i] == 0) {
//			return true;//有初始化的0就返回有空间
//		}
//	}
//	return false;
//}

	/**
	 * 获取用户输入公司名称
	 * 
	 * @return
	 */
	private static String getCompanyNameByUserInput() {
		System.out.println("请输入公司名称");
		return sc.next();
	}

	/**
	 * 获取用户输入快递单号
	 * 
	 * @return
	 */
	private static int getDeliveryNumByUserInput() {
		System.out.println("请输入快递单号");
		return sc.nextInt();
	}

}

差不多就这些了。今天到这里。
下次见!


                                                 sue
                                                 2021年1月19日15:30:59

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值