3n+1 问题 java 实现

来源:互联网 发布:软件需求变更申请表 编辑:程序博客网 时间:2024/06/05 14:39

uva number: 100

评判结果:


/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. *//** * * @author bluepomelo */import java.io.*;import java.util.*;class Main  //ReadLn以及main 函数是从uva online judge 的 submission specification下载的{    static String ReadLn (int maxLg)  // utility function to read from stdin    {        byte lin[] = new byte [maxLg];        int lg = 0, car = -1;        String line = "";        try        {            while (lg < maxLg)            {                car = System.in.read();                if ((car < 0) || (car == '\n')) break;                lin [lg++] += car;            }        }        catch (IOException e)        {            return (null);        }        if ((car < 0) && (lg == 0)) return (null);  // eof        return (new String (lin, 0, lg));    }    public static void main (String args[])  // entry point from OS    {        Main myWork = new Main();  // create a dinamic instance        myWork.Begin();            // the true entry point    }    void Begin()    {        String input;        StringTokenizer idata;        int a, b;        while ((input = Main.ReadLn (255)) != null)        {          idata = new StringTokenizer (input);          a = Integer.parseInt (idata.nextToken());          b = Integer.parseInt (idata.nextToken());                    cycleLength(a,b);        }    }    void cycleLength(int i, int j){    int min,max;    if (i < j) { min=i; max=j; } else { min=j; max=i; }//确定输入的两个参数的大小    int maxcycle=-1;//在寻找最大的循环节长度时候使用    int n=max-min+1;//从i到j的有n个整数    int [] cl=new int[n];//cl数组用于存储i到j的n个整数的循环节长度    for(int k=0;k<n;k++){ //计算n个循环节长度        int count=1;//count 表示循环节长度至少为1        int num=k+min;//num 表示一个整数,这个整数从i到j中最小整数开始。        while(num!=1){//如果num不是1,就开始以下计算,如果num是1或者说直到num是1,跳出while循环             if(num%2==0){//如果num是偶数            num=num/2;//num除以2            if(num<k+min && num>min){//这里k+min其实是当前的整数,当前整数一直除以2或者乘以3然后加,变得小于当前的整数,则可以使用之前的整数的循环节长度                count=count+cl[num-min];break;//使用之前计算好的较小的整数的循环节长度            }            else{                count=count+1;//如果当前整数一直除以2或者乘以3然后加,变得大于当前的整数,count就要加1表示循环节长度增加一个            }           }              else if(num%2!=0){//如果num是奇数            num=3*num+1;              if( num<k+min && num>min){//这里k+min其实是当前的整数,当前整数一直除以2或者乘以3然后加,变得小于当前的整数,则可以使用之前的整数的循环节长度                count=count+cl[num-min];break;//使用之前计算好的较小的整数的循环节长度            }              else{                    count=count+1;//如果当前整数一直除以2或者乘以3然后加,变得大于当前的整数,count就要加1表示循环节长度增加一个              }        }          }        cl[k]=count;//保存当前整数的循环节长度        if(count>maxcycle){//得到最大的循环节长度            maxcycle=count;        }    }        System.out.println(i+" "+j+" "+maxcycle);//输出整数i,j以及最大循环节长度}        }