考拉兹猜想,100万以内的数
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author: small-sunshine
* @Description:考拉兹猜想,100万以内的数 考拉兹猜想是1927年提出的猜想:
* 一个正整数,如果是奇数就乘以3再加1,如果是偶数就除以2,这样经过若干个次数,最终回到1。
* @date: 2021/6/25 1:00 下午
*/
@Slf4j
public class CollatzConjecture {
//百万之内
static int num = 1000 * 1000;
//存放最终结果
static List<Integer> count = new ArrayList();
//存放运算结果
static int[] array = new int[num];
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 1; i < num; i++) {
long j = i + 0L;
array[i] = kill(j, 1);
}
System.out.println(Arrays.toString(array));
int[] arrayCopy = Arrays.copyOf(array, num);
Arrays.sort(array);
for (int i = 1; i < num; i++) {
if (arrayCopy[i] == array[num - 1]) {
count.add(i);
}
}
long end = System.currentTimeMillis();
log.info("用时:" + (end - start) + "ms");
log.info(String.format("这些数:%s 的序列最多是:%d", count.toString(), array[num - 1]));
}
/**
* 考拉兹猜想-递归处理三个条件
* 1、一个问题的解可以分解为几个子问题的解
* 2、这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
* 3、存在递归终止条件
*
* @param i
* @return int
*/
public static int kill(long i, int count) {
if (i <= 0) {
return 0;
}
if (i == 1) {
return count;
}
long j = i % 2 == 0 ? i >> 1 : 3 * i + 1;
count++;
return kill(j, count);
}
}
运行结果:
用时:623ms 这些数:[837799] 的序列最多是:525
缘于生活,而归于工作。本人所书,而意于分享。
如有转载,请注明出处!
--活出自己范儿

浙公网安备 33010602011771号