1.答疑
- Java字节码:
运行于java虚拟机上。将程序抽象为字节码可以保证Java 程序员的代码能够运行在各种设备之上。 - Math.abs(-2147483648)?:
-2147483648. This strange (but true) result is a typical example of the effects of integer overflow.结果溢出。 - java内置无穷大数:Double.POSITIVE_INFINITY/Double.NEGATIVE_INFINITY.
- String不能用大于和小于比较。
- 负数的除法和余数:
表达式a/b 的商会向0 取整;a % b 的余数的定义是(a/b)*b + a % b 恒等于a。 例如-14/3 和14/-3 的商都是-4,但-14 % 3 是-2,而14 % -3 是2。余数的符号和被除数相同。 - 为什么数组的起始索引是0 而不是1 ?
这个习惯来源于机器语言,那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索引。将起始索引设为1 要么会浪费数组的第一个元素的空间,要么会花费额外的时间来将索引减1。 - 在Java 中,一个静态方法能够将另一个静态方法作为参数吗?
不行,但问得好,因为有很多语言都能够这么做。
2.习题解答
1.1.7 输出3.0009
package chapter1;
public class prac1_1_7a {
public static void main(String[] args){
double t=9.0;
while(Math.abs(t-9.0/t)>0.001){
t=(9.0/t+t)/2;
}
System.out.printf("%.5f\n",t);
}
}
1.1.8 输出b 197 e 33
package chapter1;
public class prac_1_1_8 {
public static void main(String[] args){
System.out.println('b');
System.out.println('b'+'c');
System.out.println((char)('a'+4));
System.out.println(1+2+"3");
}
}
1.1.9 二进制转换
package chapter1;
import edu.princeton.cs.algs4.StdIn;
public class prac1_1_9 {
public static void main(String[] args){
int N;
while((N=StdIn.readInt())>=0){
String s="";
for(int n=N;n>0;n/=2){
s=(n%2)+s;
}
System.out.println(s);
}
}
}
1.1.11
package chapter1;
public class prac1_1_11 {
public static void main(String[] args) {
boolean[][] b = { { true, true, true, true }, { false, false, false, false }, { true, false, true, false } };
int row = b.length;
int col = b[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (b[i][j] == true)
System.out.printf("*");
else
System.out.printf(" ");
}
System.out.println();
}
}
}
1.1.13
package chapter1;
public class prac1_1_13 {
public static void main(String[] args){
int[][] a={{1,2,3},{4,5,6}};
int row=a.length;
int col=a[0].length;
for(int i=0;i<col;i++){
for(int j=0;j<row;j++){
System.out.printf("%4d",a[j][i]);
}
System.out.println();
}
}
}
1.1.14
package chapter1;
import edu.princeton.cs.algs4.StdIn;
public class prac1_1_14 {
public static int lg(int n){
int res=1;
int times=0;
if(n==1) return 0;
else if(n>0){
while(res*2<=n){
res*=2;
times++;
}
}
return times;
}
public static void main(String[] args) {
int N;
while (!StdIn.isEmpty()) {
N = StdIn.readInt();
System.out.println(lg(N));
}
}
}
1.1.15
package chapter1;
public class prac1_1_15 {
public static void main(String[] args) {
int[] testArray={1,1,2,3,1,7,5,3,2,2,2};
System.out.println("histogram result");
printArray(histogram(testArray, 8));
}
public static int[] histogram(int[] a,int M){
int[] hArray=new int[M];
for(int i=0;i<M;++i){
int count=0;
for(int j=0;j<a.length;++j){
if(i==a[j]){
count++;
}
}
hArray[i]=count;
}
return hArray;
}
public static void printArray(int[] a){
for(int i=0;i<a.length;++i){
System.out.println("a["+i+"]: "+a[i]);
}
}
}
1.1.17 报错:不断循环,直到栈溢出,最基本的情况应该作为第一条语句return。
public static String exR2(int n)
{
String s = exR2(n-3) + n + exR2(n-2) + n;
if (n <= 0) return "";
return s;
}
1.1.19
package chapter1;
public class prac1_1_19 {
public prac1_1_19() {
int[] F = new int[100];
F[0] = 0;
F[1] = 1;
for(int i=2;i<100;++i)
F[i]=F[i-1]+F[i-2];
System.out.println(F[30]);
}
public static void main(String[] args) {
prac1_1_19 test=new prac1_1_19();
}
}
1.1.20
package chapter1;
import java.lang.Math;
import edu.princeton.cs.algs4.*;
public class prac1_1_20 {
public static void main(String[] args) {
int N=StdIn.readInt();
System.out.println(ln(N));
}
public static double ln(int N){
if(N==1)
return 0;
return ln(N-1)+Math.log(N);
}
}
1.1.21
package chapter1;
import edu.princeton.cs.algs4.StdIn;
public class prac1_1_21 {
public static void main(String[] args){
while(StdIn.hasNextLine()){
String name=StdIn.readString();
int m=StdIn.readInt();
int n=StdIn.readInt();
System.out.printf("%10s|%10d|%10d|%10.3f\n",name,m,n,(m*1.0)/n);
}
}
}
1.1.22
public static int rank_recursion(int key,int a[],int lo,int hi, int path){
System.out.printf("%5d%5d%5d\n",lo,hi,path);
int mid=lo+(hi-lo)/2;
if(lo>hi) return -1;
else if(key>a[mid]) return rank_recursion(key,a,mid+1,hi,++path);
else if(key<a[mid]) return rank_recursion(key,a,lo,mid-1,++path);
else return mid;
}
1.2.24
package chapter1;
public class prac1_1_24 {
public static int Euclid(int p,int q){
System.out.printf("p=%10d,q=%10d\n",p,q);
if(q==0) return p;
else return Euclid(q,p%q);
}
public static void main(String[] args){
int p=Integer.parseInt(args[0]);
int q=Integer.parseInt(args[1]);
int res=Euclid(p,q);
System.out.printf("p=%10d,q=%10d,gcd=%10d",p,q,res);
}
}