一尘不染

欧拉计划问题14(Collat​​z问题)

algorithm

为正整数的集合定义了以下迭代序列:

n-> n / 2(n为偶数)n-> 3n +1(n为奇数)

使用上面的规则并从13开始,我们生成以下序列:

13 40 20 10 5 16 8 4 2
1可以看出,该序列(从13开始并在1结束)包含10个项。尽管尚未证明(Collat​​z问题),但可以认为所有起始数字都以1结尾。

最长的链条中小于100万的哪个起始数字?

注意:连锁店一旦启动,条款就可以超过一百万。

我尝试使用bruteforce方法在C中对此解决方案进行编码。但是,似乎我的程序在尝试计算113383时停滞了。请告知:)

#include <stdio.h>
#define LIMIT 1000000

int iteration(int value)
{
 if(value%2==0)
  return (value/2);
 else
  return (3*value+1);
}

int count_iterations(int value)
{
 int count=1;
 //printf("%d\n", value);
 while(value!=1)
 {
  value=iteration(value);
  //printf("%d\n", value);
  count++;
 }
 return count;
}

int main()
{
 int iteration_count=0, max=0;
 int i,count;


 for (i=1; i<LIMIT; i++)
 {
  printf("Current iteration : %d\n", i);
  iteration_count=count_iterations(i);
  if (iteration_count>max)
   {
   max=iteration_count;
   count=i;
   }

 }

 //iteration_count=count_iterations(113383); 
 printf("Count = %d\ni = %d\n",max,count);

}

阅读 203

收藏
2020-07-28

共1个答案

一尘不染

拖延的原因是您通过的数字大于2^31-1(aka INT_MAX);尝试使用unsigned long long代替int

我最近在博客上写了这个;请注意,在C语言中,朴素的迭代方法已足够快。对于动态语言,您可能需要通过记忆进行优化,以便遵守 一分钟规则
(但这不是这种情况)。


糟糕,我又做了一次(这次检查了使用C ++进行的进一步优化)。

2020-07-28