C# 欧拉方案#14
我有以下问题(来自ProjectEuler.net-) 为正整数集定义以下迭代序列: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处结束 哪一个起始数字,在一百万以下,产生的链条最长 注:一
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);
}