这里写了4个小的算法,因为想删除项目,到时候到项目里面找的话,很难找,然后准备还是用博客的形式保存安逸一些,这4个小算法的排序并没有先后顺序,但是个人认为都比较金典,话不多说,进入正题:
1:近似证明哥德巴赫猜想,哥德巴赫猜想说的就是任何一个偶数可以被证明是两个素数相加得到的,这里的代码做了一些小小的优化,我觉得这个代码如果需要做的更加优秀的需要从排除素数,也就是建立一个素数表,这里就这是单纯的进行了素数的判断
package com.jk.goldbach;
/**
*
jin'shi* @author jk
* 这段代码写的是近似证明哥德巴赫猜想,哥德巴赫猜想说的是,我们通过证明任何一个偶数都可以证明是由两个素数相加得到的,这里是近似证明的原因是
* ,我们证明了一部分数,这里最主要的就是思想的问题,因为是偶数,所以我们需要从偶数开始,然后直接加2,然后还有就是因为一个数可以分解为1+m,和m+1,
* 所以我们在进行遍历的时候,遍历到一半就可以了
*
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
goldBach(100);
}
private static void goldBach(int range) {
// TODO Auto-generated method stub
for (int i = 2; i < range; i = i + 2) {
for (int j = 2; j <= i / 2; j++) {
if (isprime(j) && isprime(i - j)) {
System.out.println(i + "=" + j + "+" + (i - j));
}
}
}
}
private static boolean isprime(int j) {
boolean b = true;
for (int i = 2; i < j; i++) {
if (j % i == 0) {
b = false;
break;
}
}
return b;
}
}
2,第二个代码是水仙花数,这里我们这里求取的是各个位数的水仙花数,当然这是在java的表达范围
package com.jk.narcissusnum;
/**
*
* @author jk 这段代码写的是递推实现水仙花数的求解,我们这里需要输入的是多少位水仙花数, 其实水仙花数的递推也是很简单,
* 每次求出最低的一位,然后他的n次方求和就是了
*
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
narcissusnum(3);
}
private static void narcissusnum(int n) {
long i, start, end, temp, num, sum;
int j;
start = (long) Math.pow(10, n - 1);
end = (long) Math.pow(10, n) - 1;
for (i = start; i < end; i++) {
temp = 0;
num = i;
sum = 0;
// 判断当前的数是不是水仙花数
for (j = 0; j < n; j++) {// 解析每位数
// 获得最低的一位
temp = num % 10;
// 每次去掉最低的一位
num = num / 10;
// 求和
sum = sum + (long) Math.pow(temp, n);
}
// 如果相等则输出是水仙花
if (sum == i) {
System.out.println(i);
}
}
}
}
3第三个讲的是kmp算法,大体就是通过我们以前匹配的字符串来获得我们需要位移的字符串的个数
package com.jk.kmpdemo;
/**
*
* @author 这段代码说的是kmp匹配字符串的问题,我们需要在一个目标字符串里面找到模式串,最简单的字符串匹配是一个一个相比,
* 二人kmp是通过给模式的每个字符设置下标来判断的,大概的原理就是通过查看之前已经匹配的字符串里面有没有前缀等于已经比了的后缀的。
*
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
int s = kmp("hello world,fasjfoasfasfjsaofjsaonssaheworwur", "wur");
if (s == 1) {
System.out.println("找到了正确的字符串");
} else {
System.out.println("没有找到正确的字符串");
}
}
//进行匹配
private static int kmp(String target, String mode) {
String newtarget = 'x' + target;
String newmode = 'x' + mode;
int[] k = calculate(mode);
int i = 1, j = 1;
while (i <= target.length() && j <= mode.length()) {
if (j == 0 || newtarget.charAt(i) == newmode.charAt(j)) {
i++;
j++;
} else {
j = k[j];
}
}
if (j > mode.length()) {
return 1;
}
return 0;
}
//这里求解k
private static int[] calculate(String mode) {
String newmode = 'x' + mode;
int k[] = new int[newmode.length()];
int i = 1;
k[1] = 0;
int j = 0;
while (i < mode.length()) {
if (j == 0 || newmode.charAt(i) == newmode.charAt(j)) {
i++;
j++;
k[i] = j;
} else {
j = k[j];
}
}
return k;
}
}
第四个,是最大公约数的求解,这里是通过辗转相除的办法来获取的
package com.jk.gcddemo;
/**
* @author jk
* 这段代码写的是辗转除来求最大的公约数,其实想想也蛮简单的,首先是我们需要其实之前我们都可以不用思考,只需要思考最后一步,因为是公约数,
* 然后返回值肯定是n,这里m>n;
* 这里可能有的人会思考,为什么通过取余来得到m,n,其实仔细想想,我们通过取余去掉的都是r=m%n,n的倍数
* ,如果n是m的公约数那么r=0是符合,否则就只能去n剩下的里面去找了。
*
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int res = gcd(8, 6);
System.out.println(res);
}
private static int gcd(int i, int j) {
int m, n, r;
// 使m>n
if (i > j) {
m = i;
n = j;
} else {
m = j;
n = i;
}
// 通过辗转除来求的最大公约数
r = m % n;
while (r != 0) {
m = n;
n = r;
r = m % n;
}
// 返回最大公约数
return n;
}
}