初学算法,不会Java,各种捉急,用的算法第四版,跟着百度文库瞎掰。。。。。。。。一题一题的埋坑,,,,
下面给出可以测试多题的代码(要有Sedgewick老先生的一手安排,去网站下载库和相应的文件:http://algs4.cs.princeton.edu/code/ )
public class test {
public static int lg(int N){
int count = 0;
for(int i = 2; i <= N; i *= 2)
count++;
return count;
}
public static int[] histogram(int[] a, int M){
int[] b = new int[M];
int N = a.length;
for(int j = 0; j < N; j++)
for(int i = 0; i < M; i++){
if(i == a[j])
{
b[i]++;
}
}
return b;
}
public static String exR1(int n){
if(n <= 0) return "";
return exR1(n-3) + n + exR1(n-2);
}
public static int mystery(int a, int b){//神秘的函数,其实就是add(a,b)函数,
if(b == 0) return 0; //至于题意中说的将代码中+换成*,return 0换成return 1,并没看出来啥效果
if(b % 2 == 0) return mystery(a+a, b/2);
return mystery(a+a, b/2) + a;
}
public static void fibonacci(long[] a){
int N = a.length;
a[0] = 0;
a[1] = 1;
for(int i = 2; i < N; i++)
a[i] = a[i-1] + a[i-2];
return;
}
public static double lnn(int n){
if(n == 0) return 0;
return lnn(n-1) + Math.log(n);
}
//其中迭代中,利用的是r(余数)为零时,取b(除数)为结果,递归中用的是q(除数)为零时,p(被除数)为结果,,,其实大同小异,可以相互转换
public static int gcd(int p, int q){//应该是默认p > q
StdOut.printf("p=%d q=%d ", p, q);//这一句代码是留题目1.1.24用的,他会影响1.1.30,所以没让其输出
if(q == 0) return p;
int r = p % q;
return gcd(q, r);
}
public static boolean[][] testarray(boolean[][] a){
int N = a.length;//行数
int M = a[0].length;//列数
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(gcd(i,j) == 1)
a[i][j] = true;
else
a[i][j] = false;
}
}
return a;
}
public static void main(String[] args){
//1.1.2.c
StdOut.println("1.1.2.c:");
if(4.1 >= 4)
StdOut.println("True"); //测试结果为:True
//1.1.2.d
StdOut.println("1.1.2.d:");
StdOut.println(1 + 2 + "3");//测试结果为:33
//1.1.3
StdOut.println("1.1.3:");
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = Integer.parseInt(args[2]);
if(a == b && b == c)
StdOut.println("equal");
else
StdOut.println("Not equal");
//1.1.6
StdOut.println("1.1.6");
int f = 0;
int g = 1;
for(int i = 0; i <= 15; i++){
StdOut.printf("%d ", f);
f = f + g;
g = f - g;
}
StdOut.printf("\n");
//1.1.7.a
StdOut.println("1.1.7.a");
double t = 9.0;
while(Math.abs(t - 9.0 / t) > .001){
t = (9.0 / t + t) / 2.0;
}
StdOut.println(t);
//1.1.7.b
StdOut.println("1.1.7.b");
int sum = 0;
for(int i = 1; i < 1000; i++)
for(int j = 0; j < i; j++)
sum++;
StdOut.println(sum);
//1.1.7.c
StdOut.println("1.1.7.c");
sum = 0;
for(int i = 1; i < 1000; i *= 2)
for(int j = 0; j < 1000; j++)
sum++;
StdOut.println(sum);
//1.1.8
StdOut.println("1.1.8");
System.out.println('b');
System.out.println('b' + 'c');
System.out.println((char)('a' + 4));
//1.1.9
StdOut.println("1.1.9");
String s = "";
for(int n = 10; n > 0; n /= 2)
s = (n % 2) + s;//新得到的字符,该是由字符串前方加入
StdOut.println(s);
//另一种Java内置方法
//Integer.toBinaryString(N);//将N转换成二进制
//1.1.12
StdOut.println("1.1.12");
int[] a12 = new int[10];//同一节题目中出现同样的标识符的测试代码,在标识符后面加题号区分
for(int i = 0; i < 10; i++)
a12[i] = 9 - i;
for(int i = 0; i < 10; i++)
a12[i] = a12[a12[i]];
for(int i = 0; i < 10; i++)
System.out.printf("%d ", i);
StdOut.println();
//1.1.13
StdOut.println("1.1.13");
int [][]a13 = {
{1, 2, 3},{4, 5, 6}};
int [][]b13 = new int[3][2];//b13是a13的转置
for(int i = 0; i < 2; i++)
for(int