算法 Robert Sedgewick 习题答案 1.1 基础编程模型
2013-11-18 16:26
627 查看
似乎Algorithms 4th没有答案,那就自己做一份吧,难免有错误
stdlib,algis4两个jar包去此书官网下载导入工程
main中为我自己写的测试程序
1.1.1
7
200.0000002
true
1.1.2
double 1.618
double 10.0
boolaen true
String 33
1.1.3
1.1.4
不需要then
少括号
正确
少分号
1.1.5
1.1.6
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
斐波那契数列
1.1.7
3.00009
499500
10000
1.1.8
b
197
101
1.1.9
1.1.10
数组没有初始化
1.1.11
1.1.12
0
1
2
3
4
5
6
7
8
9
1.1.13
1.14
1.1.15
1.1.16
311361142246
字符串+整形的应用
1.1.17
基础情况永远不会被访问
1.1.18
50
33
a,b的积
33554432
177147
a的b次方
1.1.19
计算到40以上效率明显变慢(没有测试1个小时)
1.1.20
1.1.21
使用的测试数据为2012-2013赛季西甲射手榜,输入为姓名,进球数,射门数
Messi|46|235
Ronaldo|34|163
Falcao|28|123
Negredo|25|150
Soldado|24|100
Castro|18|79
Piti|18|111
Higuaín|16|56
Aduriz|14|87
Alberto|14|102
1.1.22
1.1.23
使用的查找名单为(whiteList.txt)
3
2
1
237
343452
123
12
12333
756
43
23
433
233
55
554
332
221
7666
553344
45425
2524
32442
233444
5
5525
48789
87
3269
998
646
997
777777
46554544
456488994
6464646
64465
54656
4664
468
64684
898
894
99999
4653
44
48
1.1.24
package chapter1_1;
public class Exercise24 {
public static int Euclid(int p,int q)
{
System.out.println("p="+p+" "+"q="+q);
if(q==0)
return p;
else
return Euclid(q,p%q);
}
public static void main(String[] args)
{
System.out.println(Euclid(105,24));
System.out.println(Euclid(Integer.parseInt(args[0]), Integer.parseInt(args[1])));
}
}
p=105 q=24
p=24 q=9
p=9 q=6
p=6 q=3
p=3 q=0
3
p=1111111 q=1234567
p=1234567 q=1111111
p=1111111 q=123456
p=123456 q=7
p=7 q=4
p=4 q=3
p=3 q=1
p=1 q=0
1
1.1.25
首先,算法的最终结果rN−1同时整除a和b。因为它是一个公约数,所以必然小于或者等于最大公约数g。然后,任何a和b的公约数都能整除rN−1。所以g一定小于或等于rN−1。两个不等式只在rN−1 = g是同时成立。具体证明如下:
证明rN−1同时整除a和b:
因为余数rN是0,rN−1能够整除rN−2:
rN−2 = qNrN−1因为rN−1能够整除rN−2,所以也能够整除rN−3:
rN−3 = qN−1
rN−2 + rN−1同理可证rN−1可以整除所有之前步骤的余数,包括a和b,即rN−1是a和b的公约数,rN−1 ≤ g。
证明任何整除a和b的自然数g(也就是a和b的公约数)都能整除rN-1:
根据定义,a和b可以写成g的倍数:a = mg、b = ng,其中m和n是自然数。因为r0 = a − q0b = mg − q0ng = (m − q0n)g,所以g整除r0。同理可证g整除每个余数r1、r2……rN-1。所以,最大公约数g一定整除rN−1,因而g ≤ rN−1。
因为第一步的证明告诉我们rN−1 ≤ g,所以g = rN−1。即:
g = GCD(a, b) = GCD(b, r0) = GCD(r0,
r1) = … = GCD(rN−2, rN−1) =
rN−1
stdlib,algis4两个jar包去此书官网下载导入工程
main中为我自己写的测试程序
1.1.1
7
200.0000002
true
1.1.2
double 1.618
double 10.0
boolaen true
String 33
1.1.3
package chapter1_1; public class Exercise3 { public static void main(String[] args) { if (new Exercise3().isEqual(args[0], args[1], args[2])) System.out.println("equal"); else System.out.println("not equal"); } private boolean isEqual(String s1, String S2, String S3) { return Integer.parseInt(s1) == Integer.parseInt(S2) && Integer.parseInt(S2) == Integer.parseInt(S3); } }
1.1.4
不需要then
少括号
正确
少分号
1.1.5
package chapter1_1; public class Exercise3 { public static void main(String[] args) { if (new Exercise3().isEqual(args[0], args[1], args[2])) System.out.println("equal"); else System.out.println("not equal"); } private boolean isEqual(String s1, String S2, String S3) { return Integer.parseInt(s1) == Integer.parseInt(S2) && Integer.parseInt(S2) == Integer.parseInt(S3); } }
1.1.6
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
斐波那契数列
1.1.7
3.00009
499500
10000
1.1.8
b
197
101
1.1.9
package chapter1_1; public class Exercise9 { public static void main(String[] args) { System.out.println(new Exercise9().toBinaryString(525)); } //N用二进制表示并 private String toBinaryString(int N) { String s = ""; for(int n=N;n>0;n=n>>1) s = (n&1) + s; return s; } }
1.1.10
数组没有初始化
1.1.11
package chapter1_1; public class Exercise11 { public static void main(String[] args) { boolean[][] a={{true,true},{false,true}}; System.out.print(" 0 1"); System.out.println(); for(int i=0;i<2;i++) { System.out.print(i); for(int j=0;j<2;j++) if(a[i][j]) System.out.print("*"+" "); else System.out.print(" "+" "); System.out.println(); } } }
1.1.12
0
1
2
3
4
5
6
7
8
9
1.1.13
package chapter1_1; public class Exercise13 { private int[][] transposition(int[][] a, int M, int N) { int[][] b = new int [M]; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) b[i][j] = a[j][i]; return b; } public static void main(String[] args) { int[][] a = { { 1, 2, 3, 4 }, { 3, 2, 3, 5 }, { 6, 3, 6, 8 } }; a = new Exercise13().transposition(a, 3, 4); for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) System.out.print(a[i][j] + " "); System.out.println(); } } }
1.14
package chapter1_1; public class Exercise14 { public static int lg(int N) { int count = 0; while (N != 1) { N = N >> 1; ++count; } return count; } public static void main(String[] args) { System.out.println(Exercise14.lg(33)); } }
1.1.15
package chapter1_1; public class Exercise15 { public static void main(String[] args) { int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 5, 3 }; int[] b = Exercise15.histogram(a, 11); int sum = 0; for (int i = 0; i < b.length; i++) { System.out.print(b[i] + " "); sum += b[i]; } // a[]中所有元素都在0到M-1之间,b中元素的和应该和a的长度相等 System.out.println(sum == a.length); } private static int[] histogram(int[] a, int M) { int[] b = new int[M]; for (int i = 0; i < a.length; i++) if (a[i] >= 0 && a[i] <= M - 1) b[a[i]]++; return b; } }
1.1.16
311361142246
字符串+整形的应用
1.1.17
基础情况永远不会被访问
1.1.18
50
33
a,b的积
33554432
177147
a的b次方
1.1.19
计算到40以上效率明显变慢(没有测试1个小时)
package chapter1_1; public class Exercise19 { // 递归实现斐波那契数列 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) { for (int N = 0; N < 100; N++) System.out.println(N + " " + F1(N)); } // 循环实现斐波那契数列 public static long F1(int N) { if (N == 0) return 0; int[] a = new int[N + 1]; a[0] = 0; a[1] = 1; for (int i = 2; i < a.length; i++) a[i] = a[i - 1] + a[i - 2]; return a ; } // TODO 矩阵快速幂实现斐波那契数列,此题效率已经满足要求,以后写 }
1.1.20
package chapter1_1; public class Exercise20 { public static double ln(int N) { if (N == 1) return Math.log(1); return Math.log(N) + ln(N - 1); } public static void main(String[] args) { System.out.println(ln(9)); } }
1.1.21
使用的测试数据为2012-2013赛季西甲射手榜,输入为姓名,进球数,射门数
Messi|46|235
Ronaldo|34|163
Falcao|28|123
Negredo|25|150
Soldado|24|100
Castro|18|79
Piti|18|111
Higuaín|16|56
Aduriz|14|87
Alberto|14|102
package chapter1_1; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; public class Exercise21 { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("goals.txt")); String s = null; ArrayList<forward> forwards = new ArrayList<>(); while ((s = br.readLine()) != null) { forward f = readData(s); forwards.add(f); } System.out.println("name " + "goals " + "shots " + "accuracy"); for (forward f : forwards) System.out.print(f); } catch (Exception e) { e.printStackTrace(); } } public static forward readData(String s) { String[] datas = s.split("\\|"); return new forward(datas[0], Integer.parseInt(datas[1]), Integer.parseInt(datas[2])); } } class forward { String name; int goals; int shots; double accuracy; public forward(String name, int goals, int shots) { this.name = name; this.goals = goals; this.shots = shots; this.accuracy = (double) goals / shots; } @Override public String toString() { return name + " " + goals + " " + shots + " " + accuracy + "\n"; } }
1.1.22
package chapter1_1; public class Exercise22 { private int count; public int rank(int key, int lo, int hi, int[] a) { ++count; for (int i = 0; i < count; i++) System.out.print(" "); System.out.println("lo=" + lo + " hi=" + hi); if (lo > hi) return -1; int mid = (hi - lo) / 2 + lo; if (key < a[mid]) return rank(key, lo, mid - 1, a); else if (key > a[mid]) return rank(key, mid + 1, hi, a); else return mid; } public static void main(String[] args) { int[] a = { 1, 3, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 35, 67, 78, 79 }; System.out.println(new Exercise22().rank(16, 0, a.length - 1, a)); System.out.println(new Exercise22().rank(18, 0, a.length - 1, a)); } }
1.1.23
使用的查找名单为(whiteList.txt)
3
2
1
237
343452
123
12
12333
756
43
23
433
233
55
554
332
221
7666
553344
45425
2524
32442
233444
5
5525
48789
87
3269
998
646
997
777777
46554544
456488994
6464646
64465
54656
4664
468
64684
898
894
99999
4653
44
48
package chapter1_1; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; public class Exercise23 { public int rank(int key, int lo, int hi, ArrayList<Integer> arry) { int mid = (hi - lo) / 2 + lo; if (lo > hi) return -1; if (key > arry.get(mid)) return rank(key, mid + 1, hi, arry); else if (key < arry.get(mid)) return rank(key, lo, mid - 1, arry); else return mid; } public void search(ArrayList<Integer> arry, int[] search, char c) { int[] a = new int[search.length]; for (int i = 0; i < search.length; i++) a[i] = rank(search[i], 0, arry.size() - 1, arry); if (c == '+') { for (int j = 0; j < a.length; j++) { if (a[j] == -1) System.out.print(search[j] + " "); } } else { for (int j = 0; j < a.length; j++) { if (a[j] != -1) System.out.print(search[j] + " "); } } } public static void main(String args[]) { ArrayList<Integer> arry = new ArrayList<>(); try { BufferedReader br = new BufferedReader(new FileReader( "mydata/whiteList.txt")); String s = null; while ((s = br.readLine()) != null) { arry.add(Integer.parseInt(s)); } } catch (Exception e) { e.printStackTrace(); } Collections.sort(arry); int[] search = { 2, 3, 45, 23, 77, 3269, 9787, 693, 468, 8941, 6666666, 99999, 777777 }; Exercise23 binarySearch = new Exercise23(); binarySearch.search(arry, search, '+'); System.out.println(); binarySearch.search(arry, search, '-'); } }
1.1.24
package chapter1_1;
public class Exercise24 {
public static int Euclid(int p,int q)
{
System.out.println("p="+p+" "+"q="+q);
if(q==0)
return p;
else
return Euclid(q,p%q);
}
public static void main(String[] args)
{
System.out.println(Euclid(105,24));
System.out.println(Euclid(Integer.parseInt(args[0]), Integer.parseInt(args[1])));
}
}
p=105 q=24
p=24 q=9
p=9 q=6
p=6 q=3
p=3 q=0
3
p=1111111 q=1234567
p=1234567 q=1111111
p=1111111 q=123456
p=123456 q=7
p=7 q=4
p=4 q=3
p=3 q=1
p=1 q=0
1
1.1.25
首先,算法的最终结果rN−1同时整除a和b。因为它是一个公约数,所以必然小于或者等于最大公约数g。然后,任何a和b的公约数都能整除rN−1。所以g一定小于或等于rN−1。两个不等式只在rN−1 = g是同时成立。具体证明如下:
证明rN−1同时整除a和b:
因为余数rN是0,rN−1能够整除rN−2:
rN−2 = qNrN−1因为rN−1能够整除rN−2,所以也能够整除rN−3:
rN−3 = qN−1
rN−2 + rN−1同理可证rN−1可以整除所有之前步骤的余数,包括a和b,即rN−1是a和b的公约数,rN−1 ≤ g。
证明任何整除a和b的自然数g(也就是a和b的公约数)都能整除rN-1:
根据定义,a和b可以写成g的倍数:a = mg、b = ng,其中m和n是自然数。因为r0 = a − q0b = mg − q0ng = (m − q0n)g,所以g整除r0。同理可证g整除每个余数r1、r2……rN-1。所以,最大公约数g一定整除rN−1,因而g ≤ rN−1。
因为第一步的证明告诉我们rN−1 ≤ g,所以g = rN−1。即:
g = GCD(a, b) = GCD(b, r0) = GCD(r0,
r1) = … = GCD(rN−2, rN−1) =
rN−1
相关文章推荐
- 算法(第四版 Robert Sedgewick)课后练习答案 1.1 基础编程模型
- 拜读Robert Sedgewick的《算法 第4版》——1.1基础编程模型
- 拜读Robert Sedgewick的《算法 第4版》——1.1基础编程模型
- 算法-第四版-1.1 基础编程模型-习题索引汇总
- 算法-第四版-1.1 基础编程模型-习题索引汇总
- 算法第四版1.1基础编程模型1.1.1至1.1.13
- 算法第四版1.1基础编程模型1.1.16和18
- 算法第四版1.1基础编程模型26
- 算法第一章 1.1 基础编程模型--模块化及重定向管道
- 『算法』读书笔记 1.1基础编程模型
- 算法 Robert Sedgewick 习题答案 1.2 数据抽象
- 算法第4版 1.1基础编程模型
- 算法(第四版)1.1基础编程模型练习1.1.1-1.1.8
- 算法第四版1.1基础编程模型1.1.20和21
- 算法第4版1.1基础编程模型1.1.14和15
- 深度学习基础模型算法原理及编程实现--03.全链接
- 1.1 基础编程模型
- 深度学习基础模型算法原理及编程实现--06.循环神经网络
- 算法--基础编程模型
- 深度学习基础模型算法原理及编程实现--02.线性单元