ft215378
发表于 2021-10-13 13:09:09
FlySelf 发表于 2017-2-7 11:24
执行结果:
程序执行了3.018928s。
棒
番杰
发表于 2021-10-29 10:50:39
#include<stdio.h>
#define MAX1000000
typedef unsigned int UINT;
int len = 0;
int Odd_or_Even(UINT);
int main(void)
{
unsigned int Max_len = 0,Max_num = 0;
for(int i = 1;i < max;i++)
{
len = 0;
Odd_or_Even(i);
if(Max_len < len )
{
Max_len = len;
Max_num = i;
}
}
printf("%d,%d",Max_len,Max_num);
return 0;
}
int Odd_or_Even(UINT num)
{
len ++;
if(num == 1)
return 1;
else
{
if(num % 2 ==0)
Odd_or_Even((num / 2));
else
Odd_or_Even((num * 3 + 1));
}
return 0;
}
guosl
发表于 2022-1-2 18:57:46
本帖最后由 guosl 于 2022-1-2 19:03 编辑
/*
答案:837799
耗时:0.411748秒(单核)
0.0373096秒(八核)
*/
#include <iostream>
#include <omp.h>
using namespace std;
const int N = 1000000;
int main(void)
{
volatile int nMaxLen = 0, nVal = 0;
#pragma omp parallel for shared(nMaxLen,nVal) schedule(dynamic,16)
for (int i = 1; i <= N; ++i)
{
int nStep = 1;
long long l = i;
while (l != 1LL)
{
if (l % 2LL == 0)
l = l >> 1;
else
l = 3LL * l + 1LL;
++nStep;
}
if (nStep > nMaxLen)
{
#pragma omp critical
{
nMaxLen = nStep;
nVal = i;
}
}
}
cout << nVal << endl;
return 0;
}
jerryxjr1220
发表于 2022-2-24 21:36:24
package main
import (
"fmt"
"time"
)
//题目14:
//
//以下迭代序列定义在整数集合上:
//
//n → n/2 (当 n 是偶数时)
//n → 3n + 1 (当 n 是奇数时)
//
//应用以上规则,并且以数字 13 开始,我们得到以下序列:
//
//13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
//
//可以看出这个以 13 开始以 1 结束的序列包含 10 个项。虽然还没有被证明(Collatz 问题),但是人们认为在这个规则下,以任何数字开始都会以 1 结束。
//
//以哪个不超过 100 万的数字开始,能给得到最长的序列?
//
//注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过 100 万的。
var n = mapint64{
1: 1,
2: 2,
}
func If(b bool, vt int64, vf int64) int64 {
if b == true {
return vt
} else {
return vf
}
}
func loop(a int64) int64 {
t := a
var c int64 = 0
for n == 0 {
t = If(t%2 == 0, t/2, t*3+1)
c++
}
n = n + c
t = If(a%2 == 0, a/2, a*3+1)
p := a
for n == 0 {
n = n - 1
p = t
t = If(a%2 == 0, a/2, a*3+1)
}
return n
}
func main() {
t := time.Now()
var i int64
for i = 3; i < 1000000; i++ {
_ = loop(i)
}
var max = mapint64{
"key": 1,
"value": 1,
}
for key, value := range n {
if value > max["value"] {
max["value"] = value
max["key"] = key
}
}
fmt.Println(max)
tt := time.Now()
fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
}
输出:
map
耗时: 309 ms
Asss-whom
发表于 2022-8-9 12:17:01
use std::collections::BTreeMap;
pub fn run() -> Result<(), Box<dyn std::error::Error>> {
let mut map = BTreeMap::new();
for mut x in 2..1000000u32 {
let (i, mut n) = (x, 0u32);
while x != 1 {
if x < i {
n += map.get(&x).unwrap();
break;
} else if x % 2 == 0 {
x /= 2;
n += 1
} else {
x = (3 * x + 1) / 2;
n += 2
}
}
map.insert(i, n);
}
let mut max = 0u32;
let mut num = 0u32;
for (k, v) in map {
if v > max {
max = v;
num = k;
}
}
println!("num = {num}, max = {max}");
Ok(())
}
num = 837799, max = 524
不知道链长为啥不一样……
TLM
发表于 2022-12-20 17:36:40
python版本,通过字典进行加速。注意中间值也要写入字典
import time
tt=time.time()
data={}
maxnum=(1,1)
data=1
def getl(x):
if x in data:
return (data,x)
if x%2==0:
ans=getl(x//2)+1
else:
ans=getl(3*x+1)+1
data=ans
return (ans,x)
for i in range(1,10**6+1):
maxnum=max(maxnum,getl(i))
print(maxnum)
print(time.time()-tt)
(525, 837799)
1.4954357147216797s