package com.xfm.algorithm;
import java.util.ArrayList;
import java.util.List;
/**
* java中一些经典的算法(Algorithm)
* @author xfm
*/
public class ClassicJavaAlgorithm {
/**
* 问法一、斐波那契数
* 问法二、有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
* 问每个月的兔子总数为多少?
* 1 1 2 3 5 8 13 ...
* @param n
* @return
*/
public static Long getNumber(int n){
if(n < 0){
return -1L;
}else if(n == 0){
return 0L;
}else if(n == 1 || n ==2){
return 1L;
}else{
return getNumber(n - 1) + getNumber(n - 2);
}
}
public static Long getFib(int n){
return n <= 0?-1L:n == 1||n == 2?1L:getFib(n-1) +getFib(n-2);
}
/**
* 测试递归算法与传统循环效率相比
*/
public static final int MONTH = 40;
public static void fib_test() {
Long start = System.currentTimeMillis();
System.out.println(getFib(MONTH));
System.out.println(System.currentTimeMillis()-start);
Long start1 = System.currentTimeMillis();
long f1 = 1L, f2 = 1L;
long f;
for(int i=3; i<=MONTH; i++) {
f = f2;
f2 = f1 + f2;
f1 = f;
System.out.print("第" + i +"个月的兔子对数: ");
System.out.println(" " + f2);
}
System.out.println(System.currentTimeMillis()-start1);
}
/**
* 综上,递归算法在效率上面远远低于普通循环算法
*/
/**
* 计算100-999的水仙花数字
* 打印出所有的"水仙花数(narcissus number)",所谓"水仙花数"是指一个三位数,
* 其各位数字立方和等于该数本身。
* 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
* result 153 370 371 407
*/
public static void narcissus() {
for (int i = 100; i < 1000; i++) {
int one = i/100;
int two = i/10%10;
int thr = i - i/10*10;
int res = one*one*one+two*two*two+thr*thr*thr;
if (res == i) {
System.out.println(i);
}
}
}
/**
* 题目:获取一个数以内的所有质数(素数)
* @param size
*/
public static List<Integer> getPrime(int size) {
List<Integer> integers = new ArrayList<>();
for (int i = 2; i < size; i++) {
boolean f = true;
for (int j = 2; j < i; j++) {
if (i%j == 0) {
f = false;
}
}
if (f) {
integers.add(i);
}
}
return integers;
}
/**
* 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 因式分解(factorization)
* @param num
*/
public static void factorization(int num) {
int orinNum = num;
List<Integer> is = getPrime(num+1);
List<Integer> res = new ArrayList<>();
for(int i = 0;i<is.size();i++) {
Integer integer = is.get(i);
if (num%integer == 0) {
res.add(integer);
num = num/integer;
i = 0;
}
}
StringBuffer sf = new StringBuffer();
sf.append(orinNum+"=");
for (int i = 0; i < res.size(); i++) {
if (i<res.size()-1){
sf.append(res.get(i)+"*");
} else {
sf.append(res.get(i)+"");
}
}
System.out.println(sf.toString());
}
/**
* 题目:输入两个正整数,求其最小公倍数。
* @param one
* @param two
* @return
*/
public static int leastCommonMultiple(int one,int two) {
int max = one>two?one:two;
List<Integer> is = getPrime(max);
for (Integer integer : is) {
if (one%integer == 0 && two%integer == 0) {
return integer;
}
}
return -1; } /** * 题目:输入两个正整数,求其最大公约数。 * @param one * @param two */ public static int maxCommonDivisor(int one,int two) { int max = one*two; int min = one>two?one:two; for (int i = min; i < max; i++) { if (i%one == 0 && i%two == 0) { return i; } } return max; } public static void main(String[] args) { int one = 999; int two = 45; System.out.println(one*two); int a = maxCommonDivisor(one,two); System.out.println(a); }}
java中一些经典的算法
Posted 拾荒者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中一些经典的算法相关的知识,希望对你有一定的参考价值。
以上是关于java中一些经典的算法的主要内容,如果未能解决你的问题,请参考以下文章