2017-02-03 24 views
-2

目前我正在用C语言实现Collat​​z猜想问题。我可以打印一系列特定的数字。例如,如果号码是25那么系列就像25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 = 2424是该系列中的元素的数量。现在我想打印系列号码,直到1。如25,24,...1如何减少Collat​​z猜想程序中的数字C

这是我曾尝试:

#include <stdio.h> 

int main() { 
    long x, a = 0; 

    printf("Enter the value of X:"); 
    scanf("%lu", &x); 
    printf("%ld ", x); 

    for (i = x * x; i >= 1; i--) { 
     if (x % 2 == 0) { 
      x = x/2; 
      printf("%lu ", x); 
      if (x == 1) { 
       break; 
      } 
     } else { 
      x = (3 * x) + 1; 
      printf("%lu ", x); 
      if (x == 1) { 
       break; 
      } 
     } 
     a++; 
    } 
    printf(" = %lu\n", a + 2); 
    return 0; 
} 

请帮我解决这个问题。

+1

调试器是工具箱中的一个非常重要的工具。使用调试器,您可以逐行执行代码,同时监控变量及其值。能够使用调试器是任何想要编程的人都需要的关键技能,甚至是作为兼职爱好者。 –

+0

也请花些时间[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。你需要告诉我们你给这个程序什么输入,它的实际输出是什么,以及你期望的输出。 –

+0

你需要嵌套循环(2个循环) – BLUEPIXY

回答

1

您应该添加一个额外的循环,从x一直循环到1

请注意,您的代码无法正确运行1的值,并且不计算正确点的输出数量,导致令人惊讶的最终调整+ 2

将代码移到单独的函数将提高可读性。

您的保护环路没有意义:在x * x迭代之后停止假设x * xunsigned long的范围内,该范围可能非常低(在Windows上为x < 65536)。较大的值可能会导致错误的结果。只是删除防护测试简化了代码,如果我们假设Collatz conjecture为真(它已经被测试的所有起始值高达2 )任何产生无限循环的计数器示例都是受欢迎的。

下面是一个简化和扩展版:

#include <stdio.h> 

int main(void) { 
    unsigned long xx, x, a; 

    printf("Enter the value of X: "); 
    if (scanf("%lu", &xx) != 1) 
     return 1; 

    for (; xx >= 1; xx--) { 
     x = xx; 
     a = 0; 
     for (;;) { 
      printf("%lu ", x); 
      a++; 
      if (x == 1) 
       break; 
      if (x % 2 == 0) { 
       x = x/2; 
      } else { 
       x = (3 * x) + 1; 
      } 
     } 
     printf("= %lu\n", a); 
    } 
    return 0; 
} 
1

一个好主意是为功能中的1个元素设置Collat​​z函数。这个函数将取一个元素的参数,例如25然后打印collat​​z系列25.

然后,您可以围绕该函数运行一个循环,用参数24,23,22等调用它。这将为所有这些数字提供collat​​z系列。

我没有给出代码,因为你应该自己尝试一下。