鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: 欧拉计划

题目14:找出以100万以下的数字开始的最长序列

[复制链接]
发表于 2022-8-9 12:17:01 | 显示全部楼层
  1. use std::collections::BTreeMap;

  2. pub fn run() -> Result<(), Box<dyn std::error::Error>> {
  3.     let mut map = BTreeMap::new();
  4.     for mut x in 2..1000000u32 {
  5.         let (i, mut n) = (x, 0u32);
  6.         while x != 1 {
  7.             if x < i {
  8.                 n += map.get(&x).unwrap();
  9.                 break;
  10.             } else if x % 2 == 0 {
  11.                 x /= 2;
  12.                 n += 1
  13.             } else {
  14.                 x = (3 * x + 1) / 2;
  15.                 n += 2
  16.             }
  17.         }
  18.         map.insert(i, n);
  19.     }

  20.     let mut max = 0u32;
  21.     let mut num = 0u32;

  22.     for (k, v) in map {
  23.         if v > max {
  24.             max = v;
  25.             num = k;
  26.         }
  27.     }
  28.     println!("num = {num}, max = {max}");
  29.     Ok(())
  30. }
复制代码

[Project Euler 14]
num = 837799, max = 524
[Task finished in 0.1754473s]
不知道链长为啥不一样……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-20 17:36:40 | 显示全部楼层
python版本,通过字典进行加速。注意中间值也要写入字典
  1. import time
  2. tt=time.time()
  3. data={}
  4. maxnum=(1,1)
  5. data[1]=1
  6. def getl(x):
  7.     if x in data:
  8.         return (data[x],x)
  9.     if x%2==0:
  10.         ans=getl(x//2)[0]+1
  11.     else:
  12.         ans=getl(3*x+1)[0]+1
  13.     data[x]=ans
  14.     return (ans,x)
  15. for i in range(1,10**6+1):
  16.     maxnum=max(maxnum,getl(i))
  17. print(maxnum)
  18. print(time.time()-tt)
复制代码

(525, 837799)
1.4954357147216797s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 22:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表