• 算法-1.1


    1, 表达式的值:2.0e–6 * 1 0000 0000.1

    200.0000 002

    2, 1 + 2 + “3”

    33 string

    3, 从命令行输入三个整数,相等返回equal 否则返回not equal

    public class threeParEqual
    {
        public static void main(String[] args)
        {
            
            double a = Double.parseDouble(args[0]);
            double b = Double.parseDouble(args[1]);
            double c = Double.parseDouble(args[2]);
            if (a==b&&b==c)
            {
                System.out.println("equal");
            }
            else System.out.println("not equal");
        }
    }

    8, System.out.println(‘b’+ ‘c’); System.out.println((char)(‘a’ + 4));

    197//Java中涉及byte,short和char类型的运算操作首先会把这些值转换为int类型,然后进行运算。

    9, 将一个正整数N用二进制表示并转换为一个String类型的值s。

    String s = “”;
    forint n = N; n > 0; n /= 2)
        s = (n % 2) +s;


    15, 编写一个静态方法histogram(),接受一个整型数组a[] 和一个整数M为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a[]中的值均在0到M-1之间,返回数组中的所有元素之和应该和a.length相等。

    public class Excise
    {
        public static void main(String[] args)
        {
            int N = 30;
            int M = 10;
            
            int[] a = new int[N];
            for (int i = 0; i< N;i++)
                a[i] = (int)(Math.random()*M);
        
            for (int i=0; i< N; i++)
                System.out.println(a[i]);
            int[] h = histogram(a,M);
            
            System.out.println("
    ");
            for (int i = 0; i< M;i++)
                System.out.println(h[i]);
        }
        
        public static int[] histogram(int[] a, int M)
        {
            int[] h = new int[M];
            int N = a.length;
            
            for (int i = 0; i<N; i++)
                if (a[i] < M)
                    h[a[i]]++;
            return h;
        }
    }

    19,在计算机上运行以下程序:

    public class Fibonacci
    {
        public static void main(String[] args)
        {
            for (int N = 0; N < 100; N++)
                System.out.println(N+ " "+F(N));
        }
        public static long F(int N)
        {
            if (N == 0) return 0;
            if (N == 1) return 1;
            return  F(N-1) + F(N-2);
        }
    }

    开发F(N)一个更好的实现,用数组保存已经计算过的值。

    public class Excise
    {
        public static void main(String[] args)
        {
            for (int N = 0; N < 100; N++)
                System.out.println(N+ " "+Fib(N));
        }
        public static long Fib(int N)
        {
            long[] f = new long[N+1];
            return Fib(N, f);
        }
        public static long Fib(int N, long [] f)
        {
            if (f[N]==0)
            {
                if (N==1)
                    f[N] = 1;
                else if(N >1)
                    f[N] = Fib(N-1, f) + Fib(N-2,f);
            }
            return f[N];
        }
    }

    使用数组 速度明显快很多。

    WHY? 关键字:递归,数组是连续存储

    同样问题http://segmentfault.com/q/1010000003012206

    问题1:慢下来是因为处理的数据太大了,而且每次都要再次计算?还是因为其他什么原因?

    问题1就是保存了中间结果。


     

    问题2:题目中要预测计算机在一小时内能够得到F(N)结果的最大N值,这个怎么做?

    问题2我也不肯定,我猜这个运算时间也是斐波那契数列。

    问题3:
    很好奇为什么这么快,自己尝试分析下,用N=0,1,2,3试,但是在Fib函数中为什么要if (f[N] == 0)呢?数组最后一个元素为0?
    是因为用数组 f 保存已经计算过的值了,所以不需要再重新计算了所以才快了很多吗?

    问题3的f(N)==0是用来判断这个值有没有计算过的,计算过直接调用已保存的结果,没计算过的f(N)是0,就进行if立面的计算。


    问题4:
    最后结果从93行开始,93,95,96,97,99行出现的负数,大致知道是和操作系统运算有关,但又不是很清楚,求解释?

    问题4是long长度越界了

    浅谈尾递归的优化方式http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html

    20,编写一个递归的静态方法计算ln(N!)的值

  • 相关阅读:
    理解HashSet及使用
    Java 集合类详解
    Java-泛型编程-使用通配符? extends 和 ? super
    回调函数及其用法
    log4j.properties 详解与配置步骤
    约瑟夫环
    泛型的约束与局限性
    把代码字体加大的办法
    System.arraycopy方法
    泛型数组列表与反射
  • 原文地址:https://www.cnblogs.com/IDRI/p/4852315.html
Copyright © 2020-2023  润新知