为正整数的集合定义了以下迭代序列:
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万的哪个起始数字?
注意:连锁店一旦启动,条款就可以超过一百万。
我尝试使用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); }
拖延的原因是您通过的数字大于2^31-1(aka INT_MAX);尝试使用unsigned long long代替int。
2^31-1
INT_MAX
unsigned long long
int
我最近在博客上写了这个;请注意,在C语言中,朴素的迭代方法已足够快。对于动态语言,您可能需要通过记忆进行优化,以便遵守 一分钟规则 (但这不是这种情况)。
糟糕,我又做了一次(这次检查了使用C ++进行的进一步优化)。