1、算法 第四 习题 答案 给出以下表达式的值:a. ( 0 + 15 ) / 2b. * c. true & false | true & true答案:, 给出以下表达式的类型和值:a. (1 + /2b. 1 + 2 + 3 + c. = 4d. 1 + 2 + 3答案: b. 编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印equal,否则打印not equal。public class TestUqual public static void main(String args) int a,b,c; a=b=c=0; (Please enter three numbers);
2、 a =(); b=(); c=(); if(equals(a,b,c)=1) (equal); else (not equal); public static int equals(int a ,int b , int c) if(a=b&b=c) return 1; else return 0; 下列语句各有什么问题(如果有的话)?a. if (a b) then c = 0;b. if a b c = 0; c. if (a b) c = 0;d. if (a b) c = 0 else b = 0;答案:a. if (a b) c = 0; b. if (a b) c = 0; 编写一
3、段程序,如果double 类型的变量x 和y 都严格位于0 和1 之间则打印true,否则打印false。public class TestUqual public static void main(String args) double x;double y;x=();y=();(compare(x)& compare(y);public static boolean compare(double x)If(x0&x1)returen ture;else return false; 下面这段程序会打印出什么?int f = 0;int g = 1;for (int i = 0; i .001
4、)t = t + t) / ;(%.5fn, t);b. int sum = 0;for (int i = 1; i 1000; i+)for (int j = 0; j i; j+)sum+;(sum);c. int sum = 0;for (int i = 1; i 1000; i *= 2)for (int j = 0; j 0; n /= 2)s = (n % 2) + s; 下面这段代码有什么问题?int a;for (int i = 0; i 10; i+)ai = i * i;解答:它没有用new 为a 分配内存。这段代码会产生一个variable a might not hav
5、ebeen initialized 的编译错误。 编写一段代码,打印出一个二维布尔数组的内容。其中,使用* 表示真,空格表示假。打印出行号和列号。public class Test public Test() ength;j+) (aij+ ); (); public static int MigrateArrays(int a,int b) for (int i=0;i;i+) for(int j=0;ja0.length;j+) bji=aij; return b; public static int RandomInitial(int a,int N) (初始化二维数组:); for (
6、int i=0;i;i+) for(int j=0;j=M) N=N/M; a+; return a; 编写一个静态方法histogram(),接受一个整型数组a 和一个整数M 为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a中的值均在0到M-1之间,返回数组中所有元素之和应该和 相等。public static int histogram(int a,int M) int b= new int M; int n=0; int m=0; for(int i=0;iM;i+) for(int j=0;j;j+) if(i=aj) n+; bi=n; n=0
7、; for(int i=0;iM;i+) m=m+bi; return b; 给出exR1(6) 的返回值:public static String exR1(int n)if (n = 0) return ;return exR1(n-3) + n + exR1(n-2) + n;答案:3 找出以下递归函数的问题:public static String exR2(int n)String s = exR2(n-3) + n + exR2(n-2) + n;if (n = 0) return ;return s;答:这段代码中的基础情况永远不会被访问。调用exR2(3) 会产生调用exR2(
8、0)、exR2(-3) 和exR2(-6),循环往复直到发生StackOverflowError。可以修改为:public static String exR2(int n)if (n = 0) return ;String s = exR2(n-3) + n + exR2(n-2) + n;return s; 请看以下递归函数:public static int mystery(int a, int b)if (b = 0) return 0;if (b % 2 = 0) return mystery(a+a, b/2);return mystery(a+a, b/2) + a;myster
9、y(2, 25) 和mystery(3, 11) 的返回值是多少?给定正整数a 和b,mystery(a,b)计算的结果是什么?将代码中的+ 替换为* 并将return 0 改为return 1,然后回答相同的问题。答案:50,33. 225 311 在计算机上运行以下程序:public class Fibonaccipublic static long F(int N)if (N = 0) return 0;if (N = 1) return 1;return F(N-1) + F(N-2);public static void main(String args)for (int N = 0
10、; N 100; N+)(N + + F(N);计算机用这段程序在一个小时之内能够得到F(N) 结果的最大N 值是多少?开发F(N) 的一个更好的实现,用数组保存已经计算过的值。public class Fibonaccipublic static long F(int N)if (N = 0) return 0;if (N = 1) return 1;return F(N-1) + F(N-2);public static void main(String args)int a=new int 100;a=A(a);public static long A(int a) a0=0; a1=1
11、; for (int N = 2; N 1) return (N)+factorialln(N-1); else return 0; 编写一段程序,从标准输入按行读取数据,其中每行都包含一个名字和两个整数。然后用printf() 打印一张表格,每行的若干列数据包括名字、两个整数和第一个整数除以第二个整数的结果,精确到小数点后三位。可以用这种程序将棒球球手的击球命中率或者学生的考试分数制成表格。public class ScoreTable public static void main(String args) String s = Lets go for lunch!; In in = ne
12、w In(Se); String whitelist = ();hi or not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid + 1; else return mid; return -1; if(c=-) while (lo = hi) hi or not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid + 1; else return -1; return 0; else return -1; 给出使用欧几里德算法计算105 和24
13、的最大公约数的过程中得到的一系列p 和q 的值。扩展该算法中的代码得到一个程序Euclid,从命令行接受两个参数,计算它们的最大公约数并打印出每次调用递归方法时的两个参数。使用你的程序计算1 111 111 和1 234 567 的最大公约数。public static int CommomDivisor(int x,int y) if(x=1|y=1) (x=+x+y=+y); return 1; if(x b) t = a; a = b; b = t; if (a c) t = a; a = c; c = t; if (b c) t = b; b = c; c = t; 二项分布。估计用以
14、下代码计算binomial(100, 50) 将会产生的递归调用次数:public static double binomial(int N, int k, double p)if (N = 0 & k = 0) return ; and if (N 0 | k 0) return ;return - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1);将已经计算过的值保存在数组中并给出一个更好的实现。估计递归调用次数: 100!public static double binomial(int N,int k,double p) cnt+; (N=+N
15、+k=+k+p=+p); if (N = 0 & k = 0) (N = 0 & k = 0); return ; if (N 0 | k 0) (N 0 | k 0); return 0; return - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1,p); 值保存在数组中的实现方法:public static void binomialArrays(int N,int K,double p) double a=new doubleN+1K+1; a00=1; for(int j=1;jN+1;j+) aj0=aj-10*(1-p); for (
16、int i=0;iN+1;i+) for(int j=1;j=i&jK+1;j+) aij= (1-p)*ai-1j+p*ai-1j-1; 思路: N列K行的数组:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)f(N-1,K-1)f(N-1,k)f(N,K) 删除重复元素。修改BinarySearch 类中的测试用例来删去排序之后白名单中的所有重复元素。public static int countC(int a)i+j-1 就是数组中所有和key 相等的元素。import class BinarySearch2 public BinarySearch2() hi or
17、not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid + 1; else while(amid=amid-1&mid0) mid-; return mid; return-1; public static int count (int key, int a) int cnt=0; int i=rank(key,a); while(ai=ai+1&i cnt+; i+; return cnt; public static void main(String args) ength; (M+=M+N=+N); for(in
18、t i=0;iN;i+) for(int j=0;jM;j+) if(gcd(i,j)=1) aij=true; else aij=false; return a; public static int gcd(int m,int n) if(m=0|n=0) return 1; if(m%n=0) return n; else return gcd(n,m%n); 随机连接。编写一段程序,从命令行接受一个整数N 和double 值p(0 到1 之间)作为参数,在一个圆上画出大小为 且间距相等的N 个点,然后将每对点按照概率p 用灰线连接。public class RandomAccess pu
19、blic RandomAccess() ength;j+) double temp=aij; aij=aji; aji=temp; return a; /* * 矩阵的乘积定义:一个n行m列的矩阵乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵, * 其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应 * 相乘后所有m个乘积的和。 * */ static double mult(double a, double b)ength; int N=; int P=b0.length; double c=new doubleMP; if(M!= ength
20、; if(M!= ength) ength;j+) (aij+ ); (); (); public static void Print(double a ) for (int i=0;i;i+) for(int j=0;ja0.length;j+) (aij+ ); (); (); public static void Print(double a , String name) (name+:); for (int i=0;i;i+) (ai+ ); if(i+1)%10=0) (); (); public static void Print(double a ) for (int i=0;i
21、;i+) (ai+ ); if(i+1)%10=0) (); (); public static double randominti(double a) int N=; int M=a0.length; for(int i=0;iN;i+) for(int j=0;jM;j+) aij=(N+M); return a; public static double randominti(double a) int N=; for(int i=0;iN;i+) ai=(N); return a; ength; x= transpose(a); Print(x,transpose(a)to x); x
22、=mult(a,b); Print(x,mult(a,b); double y=c; y=mult(a,c); Print(y,mult(a,c); y=mult(c,a); Print(y,mult(c,a); 过滤。以下哪些任务需要(在数组中,比如)保存标准输入中的所有值?哪些可以被实现为一个过滤器且仅使用固定数量的变量和固定大小的数组(和N 无关)?在每个问题中,输入都来自于标准输入且含有N 个0 到1 的实数。 打印出最大和最小的数 打印出所有数的中位数 打印出第k 小的数,k 小于100 打印出所有数的平方和 打印出N 个数的平均值 打印出大于平均值的数的百分比 将N 个数按照升序打印 将N 个数按照随机顺序打印实验题 模拟掷骰子。以下代码能够计算每种两个骰子之和的准确概率分布:int SIDES = 6;double dist = new double2*SIDES+1;for (i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1