鱼C论坛

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

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

[复制链接]
发表于 2021-10-13 13:09:09 | 显示全部楼层
FlySelf 发表于 2017-2-7 11:24
执行结果:
[837799, 525]
程序执行了3.018928s。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-29 10:50:39 | 显示全部楼层
  1. #include<stdio.h>

  2. #define MAX  1000000

  3. typedef unsigned int   UINT;
  4. int len = 0;

  5. int Odd_or_Even(UINT);

  6. int main(void)
  7. {
  8.         unsigned int Max_len = 0,Max_num = 0;
  9.        
  10.         for(int i = 1;i < max;i++)
  11.         {
  12.                 len = 0;
  13.                 Odd_or_Even(i);
  14.                 if(Max_len < len )
  15.                 {
  16.                         Max_len = len;
  17.                         Max_num = i;
  18.                 }
  19.         }
  20.        
  21.         printf("%d,%d",Max_len,Max_num);
  22.        
  23.         return 0;
  24. }

  25. int Odd_or_Even(UINT num)
  26. {
  27.         len ++;       
  28.        
  29.         if(num == 1)
  30.                 return 1;
  31.         else
  32.         {
  33.                 if(num % 2 ==0)
  34.                         Odd_or_Even((num / 2));
  35.                 else
  36.                         Odd_or_Even((num * 3 + 1));
  37.         }
  38.        
  39.         return 0;
  40. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 18:57:46 | 显示全部楼层
本帖最后由 guosl 于 2022-1-2 19:03 编辑
  1. /*
  2. 答案:837799
  3. 耗时:0.411748秒(单核)
  4.       0.0373096秒(八核)
  5. */
  6. #include <iostream>
  7. #include <omp.h>
  8. using namespace std;

  9. const int N = 1000000;

  10. int main(void)
  11. {
  12.   volatile int nMaxLen = 0, nVal = 0;
  13. #pragma omp parallel for shared(nMaxLen,nVal) schedule(dynamic,16)
  14.   for (int i = 1; i <= N; ++i)
  15.   {
  16.     int nStep = 1;
  17.     long long l = i;
  18.     while (l != 1LL)
  19.     {
  20.       if (l % 2LL == 0)
  21.         l = l >> 1;
  22.       else
  23.         l = 3LL * l + 1LL;
  24.       ++nStep;
  25.     }
  26.     if (nStep > nMaxLen)
  27.     {
  28. #pragma omp critical
  29.       {
  30.         nMaxLen = nStep;
  31.         nVal = i;
  32.       }
  33.     }
  34.   }
  35.   cout << nVal << endl;
  36.   return 0;
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-24 21:36:24 | 显示全部楼层
  1. package main

  2. import (
  3.         "fmt"
  4.         "time"
  5. )

  6. //题目14:
  7. //
  8. //以下迭代序列定义在整数集合上:
  9. //
  10. //n → n/2 (当 n 是偶数时)
  11. //n → 3n + 1 (当 n 是奇数时)
  12. //
  13. //应用以上规则,并且以数字 13 开始,我们得到以下序列:
  14. //
  15. //13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
  16. //
  17. //可以看出这个以 13 开始以 1 结束的序列包含 10 个项。虽然还没有被证明(Collatz 问题),但是人们认为在这个规则下,以任何数字开始都会以 1 结束。
  18. //
  19. //以哪个不超过 100 万的数字开始,能给得到最长的序列?
  20. //
  21. //注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过 100 万的。

  22. var n = map[int64]int64{
  23.         1: 1,
  24.         2: 2,
  25. }

  26. func If(b bool, vt int64, vf int64) int64 {
  27.         if b == true {
  28.                 return vt
  29.         } else {
  30.                 return vf
  31.         }
  32. }

  33. func loop(a int64) int64 {
  34.         t := a
  35.         var c int64 = 0
  36.         for n[t] == 0 {
  37.                 t = If(t%2 == 0, t/2, t*3+1)
  38.                 c++
  39.         }
  40.         n[a] = n[t] + c
  41.         t = If(a%2 == 0, a/2, a*3+1)
  42.         p := a
  43.         for n[t] == 0 {
  44.                 n[t] = n[p] - 1
  45.                 p = t
  46.                 t = If(a%2 == 0, a/2, a*3+1)
  47.         }
  48.         return n[a]
  49. }

  50. func main() {
  51.         t := time.Now()
  52.         var i int64
  53.         for i = 3; i < 1000000; i++ {
  54.                 _ = loop(i)
  55.         }
  56.         var max = map[string]int64{
  57.                 "key":   1,
  58.                 "value": 1,
  59.         }
  60.         for key, value := range n {
  61.                 if value > max["value"] {
  62.                         max["value"] = value
  63.                         max["key"] = key
  64.                 }
  65.         }
  66.         fmt.Println(max)
  67.         tt := time.Now()
  68.         fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
  69. }
复制代码

输出:
  1. map[key:837799 value:525]
  2. 耗时: 309 ms
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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-10-8 06:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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