Algorithms 4th - 1.1 Basic Programming Model - EXERCISES

28515 ワード

交流を歓迎する


  1.1.1


  a. 7
  b. 200.0000002
  c. true

  1.1.2


  a. 1.618
  b. 10.0
  c. true
  d. 33

  1.1.3

 1 public class MainApp {

 2     public static void main(String[] args) {

 3 

 4         int a = Integer.parseInt(args[0]);

 5         int b = Integer.parseInt(args[1]);

 6         int c = Integer.parseInt(args[2]);

 7 

 8         if(a == b && b == c) {

 9             System.out.println("equal");

10         } else {

11             System.out.println("not equal");

12         }

13     }

14 }

   1.1.4


a.「then」を取り除く
b.a>b外周に括弧を付ける
c.正しい
d.elseの前にコロンを付ける

  1.1.5

public class MainApp {

    public static void main(String[] args) {



        Double a = Double.parseDouble(args[0]);

        Double b = Double.parseDouble(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. b
  b. bc
  c. e

  1.1.9

 int N = 13;

 String s = "";

 for(int i = N; i > 0; i /= 2) {

     s = i % 2 + s;

}

  1.1.10


配列が初期化されていません

  1.1.11

public class TestApp1 {

    public static void main(String[] args) {



        int N = 10;

        boolean ma[][] = new boolean[N][N];



        for(int i = 0; i < N; i++) {

            for(int j = 0; j < N; j++) {

                double r = Math.random();

                if(r < 0.5)

                    ma[i][j] = true;

                else

                    ma[i][j] = false;

            }

        }



        for(int i = 0; i < N; i++) {

            for(int j = 0; j < N; j++) {

                if(ma[i][j] == true)

                    System.out.print("*");

                else

                    System.out.print(" ");

            }

            System.out.println();

        }

    }

}

  1.1.12


  0 1 2 3 4 4 3 2 1 0

  1.1.13 

public class TestApp1 {

    public static void main(String[] args) {



        int N = 10;

        int M = 15;

        boolean ma[][] = new boolean[N][M];



        for(int i = 0; i < N; i++) {

            for(int j = 0; j < M; j++) {

                double r = Math.random();

                if(r < 0.5)

                    ma[i][j] = true;

                else

                    ma[i][j] = false;

            }

        }



        System.out.println("origin matrix:");

        for(int i = 0; i < N; i++) {

            for(int j = 0; j < M; j++) {

                if(ma[i][j] == true)

                    System.out.print("*");

                else

                    System.out.print(" ");

            }

            System.out.println();

        }



        System.out.println("transposition matrix:");

        for(int i = 0; i < M; i++) {

            for(int j = 0; j < N; j++) {

                if(ma[j][i] == true)

                    System.out.print("*");

                else

                    System.out.print(" ");

            }

            System.out.println();

        }

    }

}

  1.1.14

public class TestApp1 {

    public static void main(String[] args) {



        System.out.println(lg(15));

        System.out.println(lg(16));

        System.out.println(lg(17));

    }



    private static int lg(int N) {



        int result = 1;

        while(result <= N) {

            result *= 2;

        }



        return result / 2;

    }

}

  1.1.15

public class TestApp1 {

    public static void main(String[] args) {

        int A[] = {1, 2, 3, 3, 2, 5, 5, 4};

        int N = 8;

        int M[] = histogram(A, N);

        for(int m : M) {

            System.out.println(m);

        }

    }



    private static int[] histogram(int[] A, int N) {

        int[] M = new int[N];

        for(int i = 0; i < N; i++) {

            M[A[i]]++;

        }

        return M;

    }

}

  1.1.16


  311461142246

  1.1.17


スタックがオーバーフローするまで再帰的に呼び出されるので、スタックがオーバーフローするまで停止しません.

  1.1.18


変更前:
  mystery(2, 25) = 50
  mystery(3, 11) = 33
変更後:
  mystery(2, 25) = 33554432
  mystery(3, 11) = 177147

   1.1.19

public class TestApp1 {



    private static long[] list = new long[1000];



    public static void main(String[] args) {

        F(1000);

        for(int i = 0; i < list.length; i++) {

            if(i > 0 && list[i] == 0) {

                break;

            }

            StdOut.println(i + " " + list[i]);

        }

    }



    public static void F(int N) {

        list[0] = 0;

        list[1] = 1;

        for(int i = 2; i < N; i++) {

            list[i] = list[i - 1] + list[i - 2];

            if(list[i] < list[i - 1]) {

                list[i] = 0;

                System.out.println("MAX : " + list[i - 1]);

                break;

            }

        }

    }

}

最大値は75401138047446346429

  1.1.20

public class TestApp1 {



    public static void main(String[] args) {

        for(int i = 1; i <= 10; i++) {

            System.out.println("log_fact(" + i + "): " + log_fact(i));

        }

    }



    private static double log_fact(int n) {

        if(n == 1)

            return 0;

        else

            return log_fact(n - 1) + Math.log(n);

    }

}

   1.1.21

import java.util.ArrayList;

import java.util.List;



public class TestApp1 {



    public static void main(String[] args) {



        List<Info> list = new ArrayList<Info>();

        String line;



        while(StdIn.hasNextLine()) {

            line = StdIn.readLine();

            if(line.isEmpty()) {

                break;

            }

            String[] content = line.split(" ");

            Info info = new Info(content[0], Integer.parseInt(content[1]), Integer.parseInt(content[2]));

            list.add(info);

        }



        for(Info info : list) {

            StdOut.println(info);

        }

    }

}



class Info {

    private String name;

    private int x;

    private int y;



    public Info(String name, int x, int y) {

        this.name = name;

        this.x = x;

        this.y = y;

    }



    public String toString(){

        return "1: " + name + "2: " + x + "3: " + y + "4: " + x * 1.0 / y;

    }

}

  1.1.22

import java.util.ArrayList;

import java.util.List;



public class TestApp1 {



    public static void main(String[] args) {

        rank(3, new int[]{1, 3, 5, 6, 8, 11, 25, 78, 345, 7653});

    }



    private static int rank(int key, int[] a) {

        return rank(key, a, 0, a.length - 1, 0);

    }



    private static int rank(int key, int[] a, int lo, int hi, int depth) {

        if(lo > hi)

            return -1;

        int mid = (lo + hi) / 2;

        int loop = depth;

        while(loop != 0) {

            System.out.print(" ");

            loop--;

        }

        System.out.println("lo:" + lo + " hi:" + hi);

        if(key < a[mid])

            return rank(key, a, lo, mid - 1, ++depth);

        else if(key > a[mid])

            return rank(key, a, mid + 1, hi, ++depth);

        else

            return mid;

    }

}

  1.1.23

import java.util.ArrayList;

import java.util.Arrays;



public class BinarySearch {



    private BinarySearch(){}



    public static int rank(int key, int[] a) {

        int lo = 0;

        int hi = a.length - 1;

        while(lo <= hi) {

            int mid = (lo + hi) / 2;

            if(key < a[mid])

                hi = mid - 1;

            if(key > a[mid])

                lo = mid + 1;

            else

                return mid;

        }

        return -1;

    }



    public static void main(String[] args) {

        In in = new In(args[0]);

        int[] whitelist = in.readAllInts();

        Arrays.sort(whitelist);

        String flag = args[1];



        if("+".equals(flag)) {

            while(!StdIn.isEmpty()) {

                int key = StdIn.readInt();

                if(rank(key, whitelist) == -1) {

                    StdOut.println(key);

                }

            }

        }else if("-".equals(flag)) {

            while (!StdIn.isEmpty()) {

                int key = StdIn.readInt();

                if(rank(key, whitelist) != -1) {

                    StdOut.println(key);

                }

            }

        } else {

            StdOut.println("Error Flag");

        }



    }

}

   1.1.24

public class GCD {



    public static void main(String[] args) {

        StdOut.println(gcd(105, 24));

    }



    public static int gcd(int a, int b) {

        StdOut.println("a: " + a + " b: " + b);

        if(b == 0)

            return a;

        else

            return gcd(b, a % b);

    }

}

   1.1.25


2つの数をa,b(bステップ1:c=gcd(a,b)とすると、a=mc、b=ncとする
第2ステップ:前提からr=a-kb=mc-knc=(m-kn)c
ステップ3:ステップ2の結果からcもrの因数であることがわかる
第四歩:m-knとnの互質【そうでなければ、m-kn=xd、n=ydとすることができ、(d>1)、m=kn+xd=kyd+xd=(ky+x)d、a=mc=(ky+x)dc、b=nc=ycdとすることができるため、aとbの最大公約数はcdとなり、cではなく、前の結論と矛盾する】
従って、gcd(b,r)=c、次いでgcd(a,b)=gcd(b,r)であることが分かる.
証明が終わる.