算法第四版习题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
int N)
编写一个静态方法 lg() ,接受一个整型参数 N,返回不大于 log2 N 的最大整数。不
要使用 Math 库。
public static int lga(int N,int M) { int a=0; while(N>=M)
{ N=N/M; a++;
} return a; }
1.1.15 编写一个静态方法 histogram() ,接受一个整型数组 a[] 和一个整数 M 为参数并
{
String s = exR2(n-3) + n + exR2(n-2) + n;
if (n <= 0) return "";
return s;
}
答:这段代码中的基础情况永远不会被访问。调用
exR2(3) 会产生调用 exR2(0) 、 exR2(-3)
和exR2(-6) ,循环往复直到发生 StackOverflowError 。可以修改为:
答案: a. b b. 197 c. e
1.1.9 编写一段代码,将一个正整数 N 用二进制表示并转换为一个 String 类型的值 s。
解答: Java 有一个内置方法 Integer.toBinaryString(N)
专门完成这个任务,但该题的目
的就是给出这个方法的其他实现方法。
下面就是一个特别简洁的答案:
} 1.1.14
for ( int j=0;j<a[0].
length ;j++)
{
b[j][i]=a[i][j];
}
}
return b;
}
public static int [][] RandomInitial(
int [][] a,
{
StdOut. println ( " 初始化二维数组 :" );
答案: a. 3.00009 b.499500 c. 10000
1.1.8 下列语句会打印出什么结果?给出解释。
a. System.out.println('b');
b. System.out.println('b' + 'c');
c. System.out.println((char) ('a' + 4));
void main(String[] args)
{
int a,b,c;
a=b=c=0;
StdOut. println ( "Please enter three numbers"
a =StdIn.
readInt ();
b=StdIn.
readInt ();
c=StdIn.
readInt ();
} 1.1.4
} public {
}
if ( equals (a,b,c)==1) {
StdOut. print ( "equal" ); } else {
StdOut. print ( "not equal" ); }
static int equals( int a , int b , int c)
if (a==b&&b==c) { return 1; } else { return 0; }
1.1.13 编写一段代码,打印出一个 M 行 N 列的二维数组的转置(交换行和列)。
public class Migrate {
public }
Migrate() { // TODOAuto-generated constructor stub
public static void main(String[] args) {
double x;
double y;
x=StdIn.readDouble();
y=StdIn.readDouble(); StdOut. print ( compare(x)&& compare(y) );
}
public static boolean
compare(double x)
{
If(x>0&&x<1)
返回一个大小为 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;i<M;i++) {
}
public {
} public {
static void TestPrint( boolean [][] a)
for ( int i=0;i<a. length ;i++)// 打印行号 StdOut. print ( " " +i); StdOut. println ( " " ); for ( int i=0;i<10;i++) { StdOut. print (i); for ( int j=0;j<10;j++) { if (a[i][j]) StdOut. print ( "*" +" " ); else StdOut. print ( " " +" " ); } StdOut. println ( " " ); }
static boolean [][] RandomInitial(
boolean [][] a)
for ( int i=0;i<a. length ;i++) {
for ( int j=0;j<a. length ;j++) { if (StdRandom. bernoulli
(0.1))
a[i][j]= true ; else
MigratePrint (b); // 输出转置二维数组
}
public static void MigratePrint(
int [][] a)
{
StdOut. println ( " 输出转置二维数组 :" );
for ( int i=0;i<a. length ;i++)
{
for ( int j=0;j<a[0].
String s = "";
for (int n = N; n > 0; n /= 2)
s = (n % 2) + s;
1.1.10 下面这段代码有什么问题?
int[] a;
for (int i = 0; i < 10; i++)
a[i] = i * i;
解答:它没有用 new 为 a[] 分配内存。这段代码会产生一个 variable a might not have
b. 1 + 2 + 3 + 4.0
c. 4.1 >= 4
d. 1 + 2 + "3"
答案: a.1.6序,从命令行得到三个整数参数。如果它们都相等则打印
打印 not equal 。
public {
class TestUqual
public static
public
static void main(String[] args) {
// TODOAuto-generated method stub
boolean [][] a =
new boolean [10][10];
a=RandomInitial (a);// 随机初始化 TestPrint (a);// 打印数组
1.1.7 分别给出以下代码段打印出的值:
a. double t = 9.0;
while (Math.abs(t - 9.0/t) > .001)
t = (9.0/t + t) / 2.0;
StdOut.printf("%.5f\n", t);
b. int sum = 0;
for (int i = 1; i < 1000; i++)
1.1.1 给出以下表达式的值:
a. ( 0 + 15 ) / 2
b. 2.0e-6 * 100000000.1
c. true && false || true && true
答案: a.7,b.200.0000002 c.ture
1.1.2 给出以下表达式的类型和值:
a. (1 + 2.236)/2
been initialized
的编译错误。
1.1.11 编写一段代码,打印出一个二维布尔数组的内容。其中,使用
* 表示真,空格表
示假。打印出行号和列号。 public class Test {
public }
Test() { // TODOAuto-generated constructor stub
returen ture;
else
return false;
}
} 1.1.6 下面这段程序会打印出什么?
int f = 0;
int g = 1;
for (int i = 0; i <= 15; i++)
{
StdOut.println(f);
f = f + g;
g = f - g;
}
答案: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
for (int j = 0; j < i; j++)
sum++;
StdOut.println(sum);
c. int sum = 0;
for (int i = 1; i < 1000; i *= 2)
for (int j = 0; j < 1000; j++)
sum++;
StdOut.println(sum);
( a > b ) { c = 0; }
1.1.5 编写一段程序,如果 double 类型的变量 x 和 y 都严格位于 0 和 1 之间则打印
true ,否则打印 false 。
public {
class TestUqual
public static {
void main(String[] args)
下列语句各有什么问题(如果有的话)?
a. if (a > b) then c = 0;
b. if a > b { c = 0; }
c. if (a > b) c = 0;
equal ,否则 );
d. if (a > b) c = 0 else b = 0; 答案: a. if (a > b) c = 0; b. if
for ( int i=0;i<a. length ;i++)
{
for ( int j=0;j<a[0].
length ;j++)
{
a[i][j]=StdRandom.
uniform (N);
StdOut. print (a[i][j]+
" " );
}
StdOut. println ();
}
return a;
length ;j++)
{
StdOut. print (a[i][j]+
" " );
}
StdOut. println ();
}
}
public static int [][] MigrateArrays(
int [][] a,
{
for ( int i=0;i<a. length ;i++)
{
int [][] b)
a[i][j]= false ; } } return a; }
} 1.1.12 以下代码段会打印出什么结果? int[] a = new int[10]; for (int i = 0; i < 10; i++) a[i] = 9 - i; for (int i = 0; i < 10; i++) a[i] = a[a[i]]; for (int i = 0; i < 10; i++) System.out.println(i); 答案: 0 1 2 3 4 5 6 7 8 9 如System.out.println(a[i]); 0123443210
// TODOAuto-generated method stub
int m=5;
int n=5;
int [][] a= new int [m][n];
int [][] b= new int [n][m];
a=
RandomInitial (a,n); // 初始化二维数组
b=
MigrateArrays (a,b); // 转置二维数组
for ( int j=0;j<a. length {
if (i==a[j]) {
n++; } b[i]=n; } n=0; } for ( int i=0;i<M;i++) { m=m+b[i]; } return b;
;j++)
1.1.16 给出 exR1(6) 的返回值:
a.length 相等。
public static String exR1(int n)
{
if (n <= 0) return "";
return exR1(n-3) + n + exR1(n-2) + n;
}
答案: 311361142246
1.1.17 找出以下递归函数的问题:
public static String exR2(int n)