C# 欧拉方案#14

C# 欧拉方案#14,c#,C#,我有以下问题(来自ProjectEuler.net-) 为正整数集定义以下迭代序列: n -> n/2 (n is even) n -> 3n + 1 (n is odd) 使用上述规则并从13开始,我们生成以下序列: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 可以看出,该序列(从13开始,到1结束)包含10个术语。虽然还没有得到证实(科拉兹问题),但人们认为所有起始数字都在1处结束 哪一个起始数字,在一百万以下,产生的链条最长 注:一

我有以下问题(来自ProjectEuler.net-)

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

n -> n/2 (n is even)
n -> 3n + 1 (n is odd)
使用上述规则并从13开始,我们生成以下序列:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出,该序列(从
13
开始,到
1
结束)包含10个术语。虽然还没有得到证实(科拉兹问题),但人们认为所有起始数字都在
1
处结束

哪一个起始数字,在一百万以下,产生的链条最长

注:一旦链开始,条款允许超过一百万

我用过:

   static int road (int n)
   {
       int road = 0;
       while (n != 1)
       {
           if (n % 2 == 0)
               n = n / 2;
           else
               n = 3 * n + 1;
           road++;
       }
       return road;
   }
   static void Main(string[] args)
   {
       int max = 0, num = 0;
       for (int i = 1; i < 1000000; i++)
       {
           if (road(i) > max)
           {
               max = road(i);
               num = i;
           }
       }
       Console.WriteLine(num);
   }
静态内部道路(内部n)
{
int road=0;
而(n!=1)
{
如果(n%2==0)
n=n/2;
其他的
n=3*n+1;
road++;
}
回程路;
}
静态void Main(字符串[]参数)
{
int max=0,num=0;
对于(int i=1;i<1000000;i++)
{
如果(道路(i)>最大值)
{
max=道路(i);
num=i;
}
}
控制台写入线(num);
}
但是没有打印输出。

(我不会给你一个完整的解决方案,因为Euler项目的目的是让你思考,而不是让我们这些已经解决了问题的人思考。)

试着计算出你的价值链中的价值将有多大,并记住这一点。

这并不是“什么都不输出”,它只是运行得很长。如果将for循环的上限更改为100000,您将很快看到输出。它运行很长时间的原因是,您使用未检查的整数,并且在您需要的地方不会得到overflowexception。几秒钟后,你会看到一个负数
n

尝试以下操作,即选中
关键字
,它将说明我的意思:

// will now throw OverflowException with large n
checked
{
    int road = 0;
    while (n != 1)
    {
        if (n%2 == 0)
            n = n/2;
        else
            n = 3*n + 1;
        road++;
    }
    return road;
}

首先,请注意,每次迭代调用road()函数两次,这浪费了处理时间(对于“具有副作用的函数”,可能会产生不必要的后果)

其次,由于整数溢出,您无法得到答案-例如,值113383最终围绕相同的20个左右的数字循环

-122、-61、-182、-91、-272、-136、-68、-34、-17、-50、-25、-74、-37、-110、-55、-164、-82、-41、-122

哎呀

函数问题14(){
函数r(p,n){
返回cl(p)>cl(n)→p:n;
}
函数c(n){
返回n%2==0?n/2:3*n+1;
}
函数cl(n){
var_a=1;
var _n=n;
而(_n!==1){
_a++;
_n=c(_n);
}
返回a;
}
var b=[];
var m=20;
var i=500000;
而(i<1000000){
var_n=cl(i);
如果(\n>m){
b、 推(i);
m=\u n;
}
i++;
}
返回b.reduce(r);
}


这是我的js代码。

@user1162727:Project Euler溢出长整数中的一些问题;您可能会考虑转到大整数,它可以是任意大的。当然,它们速度较慢,占用更多内存。
long
在这里就足够了。啊,好吧,当我解决PE问题时,C#甚至没有BigInteger,所以我在Java中做了这些(在某些情况下实现了我自己的大整数(用于加和乘2,这并没有那么多工作:-))。看到这个Java实现了吗
function problem14(){

    function r(p,n){
        return cl(p)>cl(n)?p:n;
    }

    function c(n){
        return n%2===0?n/2:3*n+1;
    }

    function cl(n){
        var _a = 1;
        var _n = n;
        while(_n !== 1){
            _a++;
            _n = c(_n);
        }
        return _a;
    }

    var b = [];
    var m = 20;
    var i = 500000;
    while(i < 1000000){
        var _n = cl(i);
        if(_n>m){
            b.push(i);
            m = _n;
        }
        i++;
    }

    return b.reduce(r);

}