算法 练习1.1

来源:互联网 发布:js map参数传递 编辑:程序博客网 时间:2024/06/05 18:33

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)的公约数是一样的,其最大公约数也必然相等,得证
(题目要求的用数学归纳法来证明的原理和该定理证明的原理一样,稍加修改即可。)

0 0
原创粉丝点击