A - The 3n + 1 problem

题目

#include <cstdio>
#include <algorithm>

using namespace std;

int main ()
{
    int i, j;

    while ( scanf ("%d %d", &i, &j) != EOF )
    {
        int temp_i = i;//用于记录输入顺序
        int temp_j = j;

        if ( i > j )
        {
            swap (i, j);
        }

        int max_cycle_length = 0;
        int cycle_length;

        while ( i <= j ) {
            unsigned int n = i;
            cycle_length = 1;

            while ( n != 1 ) {
                if ( n % 2 == 1 ) {
                    n = 3 * n + 1;
                    n >>= 1;
                    //or n = n >> 1;
                    //is much faster than n = n / 2;
                    cycle_length += 2;
                }
                else {
                    n /= 2;
                    cycle_length++;
                }
            }

            if ( cycle_length > max_cycle_length )
            {
                max_cycle_length = cycle_length;
            }

            i++;
        }

        printf ("%d %d %d\n", temp_i, temp_j, max_cycle_length);
    }

    return 0;
}

参考题解

注意:

  • 位运算
    左移1位相当于该数乘以2,右移1位相当于该数除以2
    位运算详解
  • 0 < n < 1,000,000,但 3 * 827370449 + 1 = 2482111348
    整型:表示整数、字符和布尔值的算术类型合称为整型(integral type)
    int、stort 和 long 都默认为带符号型。要获得无符号型则必须制定该类型为unsigned,比如unsigned long。unsigned int类型可以简写为unsigned。
    范围
    int、unsigned、long、unsigned long 、double的数量级最大都只能表示10亿,即它们表示十进制的位数不超过10个,即可以保存所有9位整数。而short只是能表示5位。对于浮点数而言使用double类型基本上不会有错。在float类型中隐式的精度损失是不能忽视的,双精度计算的代价相对于单精度可以忽略。事实上,在有些机器上,double类型比float类型的计算要快得多。float型只能保证6位有效数字,而double型至少可以保证15位有效数字(小数点后的数位),long double型提供的精度通常没有必要,而且还要承担额外的运行代价。
  • 要考虑 i > j,但不必考虑i,j = 0
  • 输出要保留输入时i,j的顺序

猜你喜欢

转载自blog.csdn.net/lykxhtp/article/details/79111792
今日推荐