本章包含五种新手学习的算法(本人目前还不太擅长集合的使用,之后可能会优化算法)
public class WorkSpace {
public static void main(String args[]){
System.out.println("1. 斐波拉契数: " + Fibonacci(40));//输出提示语和使用方法后得到的结果
System.out.print("2. 101-200之间的质数: ");//输出提示语
Prime();//方法没有返回值,直接调用就能输出结果
System.out.print("3. 所有的水仙花数: ");//输出提示语
Daffodil();//方法没有返回值,直接调用就能输出结果
System.out.println("4. 将一个正整数分解质因数: " + PrimeFactors(17865));//输出提示语和使用方法后得到的结果
;
System.out.println("5. 成绩水平: " + score(90));//输出提示语和使用方法后得到的结果
}
//斐波拉契数
public static long Fibonacci(int n){
if(n < 1){//检查输入的数是否比1还小
return -1;//返回-1
}
if(n == 1 | n == 2){//检查数字是否是1或者2
return 1;//返回1
}
long a = 1L;long b = 1L;long c = 0L;//定义a为初始第一变量,b为第二回合变量,c为最终结果
for (int i = 0; i < n - 2; i++) {//循环n-2次
c = a + b;//最终结果等于初始变量加上第二回合变量之和
a = b;//将第二回合的值赋给a
b = c;//将最终结果赋值给b,并准备下次循环,至此条件表达式不满足为止
}
return c;//返回循环之后得到的最终结果
}
//101-200之间的所有质数
public static void Prime(){
int g = 0;//定义变量g一次循环内i % 所有的j是不是都没有余数
for (int i = 101; i < 200; i++) {//数字101起直到200停止
for (int j = 2; j < i/2; j++) {//质数2起步,直到j < i/2时停止(任何数的最大因数不会超过他自身的一半)
if (i % j == 0){//没余数就不是质数,g++
g++;
break;//退出循环,节省系统资源
}
}
if (g == 0){//g经过循环后还等于0当前i是质数
System.out.print(i + " ");//输出这个质数并用空格隔开
}
g = 0;//重置g的值,以便检测下一个质数
}
System.out.println();//输出一个换行
}
//所有的水仙花数
public static void Daffodil(){
for (int i = 100; i < 1000; i++) {//水仙花数的定义是一个三位数他百位上的数字的3次方+十位上的数字的3次方+个位上的数字的3次方等于这个数本身,所以取值范围在100到1000之间
int a = i / 100;//i / 100 的商就是百位上的数字
int b = (i % 100) / 10;//i % 100 的余数再 / 10 得到的商就是十位上的数字
int c = (i % 100) % 10;//i % 100 的余数再 % 10 得到的余数就是个位上的数字
if((a * a * a) + (b * b * b) + (c * c * c) == i){//如果a , b , c 三个数的平方想加等于 i 那么这个数就是水仙花数
System.out.print(i + " ");//输出这个水仙花数并用空格隔开
}
}
System.out.println();//输出一个换行
}
//将一个非质数的正整数分解为质因数;
//用集合作比较方便,数组是定长的,虽然数组的长度可以设置为变量,但是数组的长度初始化之后就固定了,也就是说即使是变量,初始化之后变量改变,数组的长度也不会再改变了,所以方法看起来很复杂其实都是繁琐的定义长度,存入值,去除空值
public static String PrimeFactors(int n){
//储存n的初始值
int k = n;
//查找n之下的所有质数,之后将他们放入质因数表中
int g = 0;//定义g用来判定j循环之后i是质数
int z = 0;//定义z作为Z的索引
int[] Z = new int[n / 2];//创建一个长度为n的一半的数组Z
for (int i = 2; i <= n; i++) {//从质数2开始循环,到n停止
for (int j = 2; j <= i/2; j++) {//从质数2开始循环 ,到i的一半停止
if(i % j == 0){//没余数表示整除
g++;//g自增
break;//退出当次循环,节省系统资源
}
}
if (g == 0){//g经历循环后依旧为0则i为质数
Z[z] = i;//将i存入索引为z的数组Z中
z++;//Z存入一个数字z自增一次
}
g = 0;//将g归零处理
}
//取出有用的值, 去除空值
int G = 0;//定义G储存数组Z内不为零的值的个数
for (int i = 0; i < Z.length; i++) {//循环次数为Z长度值
if(Z[i] != 0){//索引的值不为零则为所需求的数
G++;//G自增一次
}
}
int[] Y = new int[G];//创建数组Z定义初始长度为G的值
for (int i = 0; i < Y.length; i++) {//循环次数为Y的长度值
if(Z[i] != 0){//判断索引值是否为空
Y[i] = Z[i];//Z[i]不为空时将值存入Y[i]中
}
}
//确定质因数的个数
String[] a = new String[Y.length];//建立一个和Y长度一样的字符串数组
int N = 0;//定义变量N储存质因数的个数
for (int i = 0; n != 1; i++) {//n不等于1时循环继续
for (int j = 0; n != 1; j++) {//n不等于1时循环继续
if (n % Y[j] == 0){//判断n模Y[j]是否能整除
a[i] = ("" + Y[j]);//将y[j]的值转化成字符串存入a[i]中
n = n / Y[j];//将n / Y[j]的值赋值给n进行新一次的循环直至n等于1为止
N++;//每有一个符合要求的值N就自增一次
break;//退出当次循环节省系统资源
}
}
}
//最终输出分解出的质因数式子
String[] A = new String[N];//新建字符串数组A,长度为质因数的个数;
String d ="" + k + " = " + a[0];//定义d储存初始的质因数
for(int i = 0;i < A.length;i++){//循环次数为A的长度值
A[i] = a[i];//将a[i]的值赋给A[i]
if(i != 0){//确定是否是第一个质因数,因为初始给d赋值了第一个质因数,所以得跳过第一个
d += ("×" + A[i]);//将后续的所有质因数转化为字符串并用×拼接
}
}
return d;//返回字符串d
}
//学习成绩
public static char score(int a){
char z = a >= 90 ? 'A' : (a >= 60 ? 'B' : (a < 60 ? 'C' : 'D'));
return z;
}
}
效果演示图: