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