小编Sor*_*ntz的帖子

最长的Collat​​z(或Hailstone)序列优化 - Python 2.7

我制作了一个程序,打印出一个数字列表,每个数字都有一个步骤(根据Collat​​z猜想)需要比前一个更多的步骤:

limit = 1000000000
maximum = 0
known = {}
for num in xrange(2, limit):
    start_num = num
    steps = 0
    while num != 1:
        if num < start_num:
            steps += known[num]
            break;
        if num & 1:
            num = (num*3)+1
            steps += 1
        steps += 1
        num //= 2
    known[start_num] = steps
    if steps > maximum:
        print start_num,"\t",steps
        maximum = steps
Run Code Online (Sandbox Code Playgroud)

我缓存了我已经知道的结果来加速程序.这种方法可以达到10亿的限制,我的计算机内存不足(8GB).

  1. 是否有更有效的方法来缓存结果?
  2. 有没有办法进一步优化这个程序?

先感谢您.

python algorithm optimization caching collatz

2
推荐指数
1
解决办法
2145
查看次数

BigInteger.intValue()> 1给出错误的布尔值

我正在尝试将BigInteger数转换为二进制数.我使用while循环来减少BigInteger,直到它等于1,在循环运行时取余数.

循环的条件是:(decimalNum.intValue()> 1).

但程序只进行一次循环然后认为BigInteger小于/等于1,而实际上它大约是55193474935748.为什么会发生这种情况?

("inBinary"是一个ArrayList,用于保存循环中的余数.)

这是while循环:

while (decimalNum.intValue()>1){
      inBinary.add(0, decimalNum.mod(new BigInteger("2")).intValue()); //Get remainder (0 or 1)
      decimalNum = decimalNum.divide(new BigInteger("2")); //Reduce decimalNum
}
Run Code Online (Sandbox Code Playgroud)

java math conditional biginteger while-loop

0
推荐指数
1
解决办法
660
查看次数