java笔记1.19
共两个部分:
把一个整数分解一个质因数
不得不说,我一开始不晓得什么是质因数。我居然跑去补数学了。笑死我了。
简单来说就是:
- 名称等价:
- 质因数 = 质因子 = 素因数
- 质数 = 素数
- 因数 = 约数
确定记住,那么往下看:
- 定义:
- 质因数: 能整除给定一个正整数的素数,即一个正整数的约数,但该约数又是质数
- 因数:整数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