1.1.1
a.7;
b.200.0000002;
c.true.
1.1.2
a.double,1.618;
b.double,10.0;
c.boolean,true;
d.string,33.
1.1.3
public class Exercise1_1_3{
public static void main(String[] args){
double a = Doubleparse.Double(args[0]);
double b = Doubleparse.Double(args[1]);
double c = Doubleparse.Double(args[2]);
if(a == b&&b == c)
System.out.println("equal");
else
System.out.println("not equal");
}
}
1.1.4
a.if不能与then搭配;
b.应该用括号将a>b括起来;
c.没有问题;
d.c=0后面少个”;”.
1.1.5
public class Exercise1_1_5{
public static void main(String[] args) {
double a = Doubleparse.Double(args[0]);
double b = Doubleparse.Double(args[1]);
if(a > 0&&a < 1&&b > 0&&b < 1)
System.out.println("true");
else
System.out.println("false");
}
}
1.1.6
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
1.1.7
a.3.00009;
b.499500;
c.10000.
1.1.8
a.98;
b.197;
c.e.
1.1.9
String s = "";
for(int n = N;n > 0;n /= 2)
s = (n % 2) + s;
1.1.10
它没有用new为a[]分配内存。
1.1.11
import edu.princeton.cs.algs4.StdOut;//我是在eclipse中运行的
import edu.princeton.cs.algs4.StdRandom;
public class Exercise1_1_11{
public static void main(String[] args){
boolean[][] a = new boolean[10][10];
a = RandomInitial(a);//随机初始化数组
Print(a);//打印数组
}
public static void Print(boolean[][] a){
for(int i = 0;i < a.length;i++)
StdOut.print(" " + i);
StdOut.print(" ");
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();
}
}
public 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
a[i][j] = false;
}
return a;
}
}
1.1.12
0
1
2
3
4
5
6
7
8
9
1.1.13
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
public class Exercise1_1_13{
public static void main(String[] args){
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);//转置二维数组
MigratePrint(b);//打印转置的二维数组
}
public static void MigratePrint(int[][] b){
StdOut.println("转置之后的二维数组");
for(int i = 0;i < b.length;i++){
for(int j = 0;j < b[0].length;j++)
StdOut.print(b[i][j] + " ");
StdOut.println();
}
}
public static int[][] MigrateArrays(int[][] a,int[][] b){
for(int i = 0;i < a.length;i++){
for(int j = 0;j < a[0].length;j++){
b[i][j] = a[j][i];
//StdOut.print(a[i][j]);
}
//StdOut.println();
}
return b;
}
public static int[][] RandomInitial(int[][] a,int N){
StdOut.println("初始化的二维数组");
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;
}
}
1.1.14*
(感觉这题好经典)
public static int lga(int N,int M){
int a = 0;
while(N >= M){
N = N / M;
a++;
}
return a;
}
1.1.15
public static int[] histogram(int[] a,int M){
int m = 0;
int n = 0;
for(int i = 0;i < M;i++){
for(int j = 0;j < a.length;j++){
if(i == a[j])
n++;
b[i] = n;
}
n = 0;
}
for(int i = 0;i < M;i++)
m = m + b[i];
return b;
}
1.1.16
311361142246
1.1.17
(书上有答案)
这段代码中的基础情况永远不会被访问。调用exR2(3)会产生调用exR2(0)、exR2(-3)和exR2(-6),循环往复直到发生StackOverflowError。
1.1.18
50,33,a*b;
65795,6574.(即为2^25,3^11).
1.1.19
(第一问自己试一下,毕竟要等一个小时,下面直接看第二问)
public class Fibonacci{
public 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 [100];
a = A(a);
}
public static long[] A(int[] a){
a[0] = 0;
a[1] = 1;
for(int N = 2;N < 100;N++){
a[N] = a[N -1] + a[N - 2];
StdOut.println(N + " " +a[N]);
}
}
}
1.1.20
public static double factorialln(long N){
if(N > 1)
return Math.ln(N) + factorialln(N - 1);
else
return 0;
}
1.1.21
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_1_21 {
public static void main(String[] args) {
int M = 3;
int index = 0;
String[] strs = new String[M];
while(index < M)
strs[index++] = StdIn.readLine();
for(int i = 0; i < strs.length; ++i) {
String[] arr = strs[i].split("\\s+");
double temp = Double.parseDouble(arr[1]) / Double.parseDouble(arr[2]);
StdOut.printf("%-10s %-10s %-10s %-13.3f\n", arr[0], arr[1], arr[2], temp);
};
}
}
1.1.22
import java.util.Arrays;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
public class Exercise1_1_22{
public static void main(String[] args){
int N = 1024;
int[] arr = new int[N];
for(int i = 0;i < arr.length;i++)
arr[i] = StdRandom.uniform(N * 50);
Arrays.sort(arr);
StdOut.print("seq = ");
for(int i = 0;i < arr.length;i++)
StdOut.print(arr[i] + "\t");
int key = arr[StdRandom.uniform(N)];
StdOut.println("\nkey = " + key);
StdOut.println("------------------------------------------------------------------");
binarySearch(key,arr,0);
}
public static int binarySearch(int key,int[] arr,int depth){
return rank(key,arr,0,arr.length - 1,depth);
}
public static int rank(int key,int[] arr,int low,int high,int depth){
printCallInfo(low,high,depth);
if(low > high)
return -1;
int mid = low + (high - low) / 2;
if(key < arr[mid])
return rank(key,arr,low,mid -1,depth + 1);
else if(key > arr[mid])
return rank(key,arr,mid + 1,high,depth + 1);
else
return mid;
}
private static void printCallInfo(int low,int high,int depth){
StdOut.print(depth + "\t");
printIndent(depth);
StdOut.println(low + "\t" + high);
}
private static void printIndent(final int indents){
for(int i = 0;i < indents;i++)
StdOut.print("-----------");
}
}
1.1.23
import java.util.Arrays;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_1_23{
public static boolean BinaryLookup(int key,int[] arr){
int low = 0;
int high = arr.length - 1;
while(low <= high){
int mid = low + (high - low) / 2;
if(key < arr[mid])
high = mid - 1;
else if(key > arr[mid])
low = mid + 1;
else
return true;
}
return false;
}
public static void main(String[] args){
char symbol = '-';
int[] whitelist = new In(args[0]).readAllInts();
Arrays.sort(whitelist);
while(!StdIn.isEmpty()){
int key = StdIn.readInt();
boolean found = BinaryLookup(key,whitelist);
if('+' == symbol&&!found)
StdOut.println(key);
if('-' == symbol&&found)
StdOut.println(key);
}
}
}
测试命令:java xxx tinyW.txt < tinyT.txt
1.1.24
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_1_24 {
public static void main(String[] args){
int p = Integer.parseInt(args[0]);
int q = Integer.parseInt(args[1]);
int gcd = Euclid(p,q);
StdOut.println(" **********" + gcd);
}
public static int Euclid(int p,int q){
if(q == 0)
return p;
StdOut.println(q + " " + p % q);
return Euclid(q,p % q);
}
}
1.1.25
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
(题目要求的用数学归纳法来证明的原理和该定理证明的原理一样,稍加修改即可。)