• POJ(3n+1 problem的几种解法)


    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int p[10005];
     4 int fmax(int i,int j)
     5 {
     6     if(i>j)
     7         return i;
     8     else
     9         return j;
    10 }
    11 void ff()
    12 {
    13     int i,j,sum;
    14     memset(p,-1,sizeof(p));
    15     p[1]=1;
    16     p[2]=2;
    17     for(i=3;i<=10000;i++)
    18     {
    19         j=i;
    20         sum=0;
    21         while(1){
    22             if(j%2 == 0)
    23                 j/= 2;
    24             else j=j*3+1;
    25             ++sum;
    26             if(j<=10000&&p[j]!=-1)
    27                 break;
    28         }
    29         p[i]=p[j]+sum;
    30 
    31     }
    32 }
    33 int main()
    34 {
    35     int i,j,tpi,tpj,tp,sum,max,k;
    36     ff();
    37     while(scanf("%d%d",&i,&j)==2)
    38     {
    39         tpi=i;
    40         tpj=j;
    41         if(i>j)
    42         {
    43             tp=i;i=j;j=tp;
    44         }
    45         max=p[i];
    46         for(k=i;k<=j;k++)
    47             max=fmax(max,p[k]);
    48         printf("%d %d %d\n",tpi,tpj,max);
    49     }
    50     return 0;
    51 }

    这种貌似是预先处理的方法。我也不知道具体叫什么来着。

    View Code
     1 #include<stdio.h>
     2 int f(int n)
     3 {
     4     int i,j,sum=1;
     5     if(n==1||n==2)
     6         return n;
     7     else
     8     if(n>2)
     9     {
    10         while(1)
    11         {
    12             if(n%2==1)
    13             {
    14                 sum++;
    15                 n=n*3+1;
    16             }
    17             else
    18             {
    19                 sum++;
    20                 n=n/2;
    21             }
    22             if(n==1)
    23                 break;
    24         }
    25     }
    26     return sum;
    27 }
    28 int max(int i,int j)
    29 {
    30     if(i>j)
    31         return i;
    32     else
    33         return j;
    34 }
    35 int main()
    36 {
    37     int i,j,k,sum,tpi,tpj,tp;
    38     while(scanf("%d%d",&i,&j)==2)
    39     {
    40         tpi=i;
    41         tpj=j;
    42         if(i>j)
    43         {
    44             tp=i;i=j;j=tp;
    45         }
    46         sum=f(i);
    47         for(k=i+1;k<=j;k++)
    48         {
    49             sum=max(sum,f(k));
    50         }
    51         printf("%d %d %d\n",tpi,tpj,sum);
    52     }
    53     return 0;
    54 }

    这种就没什么技巧了。

    keep moving...
  • 相关阅读:
    python编码基础知识
    python编码问题
    python中文乱码
    mysql sql灵活运用
    MySQL函数讲解(MySQL函数大全)
    python:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xef in position xxx: ordinal not in range(128)
    sql replace into 与 insert into
    微信布局
    盘点六大在中国复制失败的O2O案例
    字符串问题(一)
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2478076.html
Copyright © 2020-2023  润新知