【发布时间】:2012-09-10 23:04:03
【问题描述】:
好的,我知道这听起来像是家庭作业;但无论如何。我正在尝试使用 C# 解决这个problem。问题描述摘录如下:
给定一个输入n,可以确定数字的个数 打印(包括1)。对于给定的 n,这称为 n的周期长度。在上面的例子中,循环长度 22 是 16。 对于任何两个数字 i 和 j,你要确定 i 和 j 之间所有数字的最大循环长度。
问题
除了一件事,周期长度,我什么都懂。我只是不完全理解。我发现文本对它的定义模棱两可。我假设,循环长度是序列中有多少个数字,所以可以说输入为 10,循环长度为 8。但我不确定。您不需要任何代码,但我只需要指导。
此外,我已经知道如何从标准输入和输出中读取。由于问题在于编程竞赛格式。
显示以 n 作为输入的数字序列的实现
static void collatz(ref int n)
{
if (n % 2 == 0)
{
n /= 2;
}
else
{
n = (3 * n) + 1;
}
Console.WriteLine(n);
}
static int GetCycleLength(int n)
{
if (n > 0)
{
int count = 1;
while (n != 1)
{
collatz(ref n);
count++;
}
return count;
}
else
{
return -1;
}
}
注意事项
虽然不是作业,但我想当作作业,所以我把它作为标签之一。
【问题讨论】:
-
该页面明确定义了“周期长度”的含义。
-
带有记忆的递归解决方案应该可以很好地工作。