【问题标题】:The 3n+1 algorithm3n+1算法
【发布时间】:2018-04-06 15:08:03
【问题描述】:

给出了一些整数n。如果 n 是奇数,则执行 3 n+1 和 n / 2 如果 n 是偶数的任务。当 n 达到 1 时完成工作。在 n 达到 1 之前创建的数字称为循环长度。当两个数 I 和 j 试图获得 I 和 j 之间所有数的最大循环长度。 有没有不写全局变量的情况下比较循环长度的方法?

#include<stdio.h>
void cycle(int num) {
     int count = 1;
     while (1)
     {
            if (num == 1)
            break;

        if (num % 2 == 1) {
            num = 3 * num + 1;
            count++;
            printf("%d ", num);
        }
        else {
            num = num / 2;
            count++;
            printf("%d ", num);
        }
    }
    printf("\ncycle-length : %d\n", count);

}


void cycle_count(int num1,int num2) {
    int num;

    for (num = num1; num <= num2; num++) 
    {
        cycle(num);
    }

}
void main() 
{
    int num1, num2;
    scanf("%d %d", &num1,&num2);
    cycle_count(num1, num2);

    return;

}

【问题讨论】:

  • 你的函数都是void类型的。如果您将它们设为int 类型(无论如何都应该是main),您可以将一个值传回给调用者。
  • 如将结果存储到数组中而不是立即打印?
  • @usr2564301 只需要保存起始条件和最大循环长度即可。
  • 代码的意义何在?它是否有效?如果不是,为什么不呢?你到底在问什么?您询问全局变量,但您没有定义。
  • 这是Collatz sequence。有了这句话,你应该可以在网上找到无数的资源。

标签: c algorithm max collatz


【解决方案1】:

只需将函数声明为返回找到的值即可。

考虑到根据 C 标准,没有参数的函数 main 应声明为

int main( void )

这是一个演示程序

#include <stdio.h>

size_t cycle( unsigned int num ) 
{
    size_t count = 0;

    enum { EVEN = 0, ODD };     

    while ( num > 1 )
    {
        switch ( num % 2 )
        {
            case EVEN:
                num /= 2;
                break;

            case ODD:
                num = 3 * num + 1;
                break;
        }

        ++count;
    }

    return count;
}

size_t cycle_count( unsigned int num1, unsigned int num2 ) 
{
    size_t max_count = 0;

    if ( num2 < num1 )
    {
        unsigned int tmp = num1;
        num1 = num2;
        num2 = tmp;
    }

    for ( unsigned int num = num1; num <= num2; num++ ) 
    {
        size_t n = cycle( num );
        if ( max_count < n ) max_count = n;
    }

    return max_count;
}

int main(void) 
{
    unsigned int num1, num2;

    printf( "Enter two non-negative numbers: " );
    scanf( "%u %u", &num1, &num2 );

    printf( "The maximum cycle length is equal to %zu\n", cycle_count( num1, num2 ) );

    return 0;
}

它的输出可能看起来像

Enter two non-negative numbers: 1 10
The maximum cycle length is equal to 19

注意,在我的函数中,我从 0 开始计算循环长度。您可以根据需要更改初始值。

【讨论】:

  • 在这里好奇地使用size_t 作为size_t 对于数组索引和大小调整很有用。我希望unsignedunsigned longunsigned long long
  • @chux 不是 unsigned long 通常 size_t 是吗?:)
  • 也许size_tunsigned long 具有相同的范围——或者可能不是?我曾在size_t 范围小于unsigned long 的系统以及size_t, unsigned, unsigned long 都具有相同范围的系统上工作过。撇开这一点不谈,由于不知道 Collatz sequence 具有已知的上限,代码可以使用 unsigned(用于速度)或 uintmax_t 用于迂腐范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多