• [解题报告]The 3n + 1 problem


    题目大意

    题目原文:http--uva.onlinejudge.org-external-1-100.pdf

    背景

    在计算机科学中的问题往往被列为属于某一类问题,例如 NP、 不可解的递归。在这一类问题会分析一种算法,其分类是输入不已知的所有可能的属性。

    问题

    请考虑下面的算法:

    1. input n

    2. print n

    3. if n = 1 then STOP

    4. if n is odd then tex2html_wrap_inline44

    5. else tex2html_wrap_inline46

    6. GOTO 2

    鉴于 22 输入,下面的数字序列将打印的 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

    当打印 1时上述算法将终止。算法很简单,尽管这一猜想是否真实。然而,对于所有整数n这种那个 0 < n < 1,000,000 (这比很多更多数字)它已经过验证

    在上面的示例中,22 的周期长度是 16。

    对于任何两个数字ij,你要确定在i和j之间的最大周期长度。

    输入

    输入将包括一系列的对整数j,一个对每行的整数。所有的整数将不少于 1,000,000 和大于 0。

    您可以假定没有操作溢出一个 32 位整数。

    输出

    应输出i和j,按输入的顺序,和介于i和j之间(包括i和j)所有数的最大周期长度

    Sample Input:

    1 10
    100 200
    201 210
    900 1000
    

    Sample Output:

    1 10 20
    100 200 125
    201 210 89
    900 1000 174
    

    算法:

    我们要考虑的是当i的值大于j的值时候要将这俩个值进行交换,其次要注意包括自己本身,所以计数的时候不该把自己本身所漏掉。

    还要注意就是代码的简练。

    代码:这里附上我的代码,你可以去这里提交你的代码验证你的代码是否正确,

    View Code
     1 #include<stdio.h>
     2 int main(void)
     3 {
     4     int num1=0,flag=1;
     5     int i,j,a,b,n,num2,temp;
     6 
     7     while(EOF!=scanf("%d %d",&i,&j))
     8     {
     9         a=i;
    10         b=j;
    11         num2=1;
    12         if(i>j)
    13         {
    14             temp=i;
    15             i=j;
    16             j=temp;
    17         }
    18 
    19       for(;i <= j;i++)
    20       {
    21           n=i;
    22          while(flag)
    23           {
    24 
    25               if(n==1)
    26               {
    27                   num1++;
    28                   flag=0;
    29               }
    30               else if(n%2==0)
    31                  {
    32                      n=n/2;
    33                      num1++;
    34                  }
    35                 else
    36                 {
    37                     n=n*3+1;
    38                     num1++;
    39                 }
    40 
    41           }
    42             if(num1 >num2)
    43             num2=num1;
    44             num1=0;
    45             flag=1;
    46 
    47      }
    48     printf("%d %d %d\n",a,b,num2);
    49 
    50  }
    51    return 0;
    52 }
  • 相关阅读:
    Codeforces 662D International Olympiad【贪心】
    LightOJ 1236 Pairs Forming LCM【整数分解】
    LightOJ 1341 Aladdin and the Flying Carpet【整数分解】
    LightOJ 1370 Bi-shoe and Phi-shoe【欧拉函数 && 质数】
    SGU 106 The equation【扩展欧几里得】
    unity 第三人称控制移动
    unity Animator做简单的人物动画
    unity 背包系统
    unity 针对UI的射线穿透的两种方式
    用角色控制器控制移动和碰撞
  • 原文地址:https://www.cnblogs.com/qisong178878915/p/2890520.html
Copyright © 2020-2023  润新知