zoukankan      html  css  js  c++  java
  • 100 The 3n + 1 problem

    题目大意
    题目原文 http://uva.onlinejudge.org/external/1/100.pdf

    一个数(一百万以内)如果是奇数,乘三加一;如果是偶数,除以二;循环下去,直到等于1为止,这样包括他自己本身出现的数字的个数被称为该数字的“3n+1长度”;题目要求输入两个数,求出这两个数(i和j)之间的最长的“3n+1长度”。

    首先想到i和j有大小的关系,但题目要求输出的顺序不变,所以先输入i和j并立马打印出来,然后再比较i和j的大小并交换。然后根据穷举法,逐个求出i和j之间的数的“3n+1长度”,并设置一个变量来保存它,求出最大值,最后打印出这个最大值。


    附上代码:

    View Code
    附上代码:
    
    #include<stdio.h>
    long f(long a) //该函数返回数a的“3n+1长度”
    {
      long i=1;
      while(a!=1)
      {
       if(a%2) a=3*a+1;
       else a/=2;
       i++;
      }
      return i;
    }
    
    int main()
    {
       long i,j,n,m,x;         //变量为long是因为题目要求i和j在一到一百万之间
       while(scanf("%ld%ld",&i,&j)!=EOF)
       {
        printf("%ld %ld ",i,j);//首先打印出输入的i和j,有空格来应题目格式要求
        n=0;                   //“3n+1长度”一定会大于0,n用于保存当前最大的“3n+1长度”
        if(i>j) {x=i;i=j;j=x;} //比较大小并交换
        for(;i<=j;i++)
        {
          m=f(i);
          if(m>n) n=m;
        }                       
        printf("%ld\n",n);
       }
       return 0;
    }
  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/syiml/p/100_.html
Copyright © 2011-2022 走看看