算法 练习1.1

本文解析了一系列Java编程习题,包括变量定义、条件判断、数组操作、递归算法等内容,并给出了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值