算法-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 = “”; for (int 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("\n"); 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!)的值