好吧,我知道这听起来像是家庭作业,但无论如何。我试图用c来解决这个问题。问题描述摘录如下:
给定一个输入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;
     }
}

笔记
虽然不是家庭作业,但我想把它当作家庭作业,所以我把它当作一个标签。

最佳答案

你应该使用动态编程。也就是说,如果你为一个数j工作,而为j工作时,如果你遇到k,那么你不应该再为k重复整个工作。
所以从j开始往下到i。假设你在为一个数n寻找周期长度。当为n寻找周期长度时,假设你遇到了数:n,n8,n7,n6,…,n1那么n的循环长度是9,n8的循环长度是8,n7的循环长度是7。在数组或映射中存储所有此类数字的周期长度。当你遇到相同的数字来寻找不同数字的周期长度时,尽可能地重用它们。这将为这个问题提供一个最佳的解决方案。
参见http://en.wikipedia.org/wiki/Dynamic_programming#Fibonacci_sequence上动态编程的示例

07-26 01:45