欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java语言程序设计(基础篇)(原书第10版) 练习题答案 第6章

程序员文章站 2024-03-02 11:56:10
...

基础篇课后习题答案,做了大部分,虽然不一定是最佳代码,但是保证每个都能运行,如有更好的答案,欢迎讨论


6.1 计算五角数

public static void main(String[] args) {
    for (int i = 1; i <= 100; i++) {
        if (i % 10 == 0) {
            System.out.printf("%-6d\n", getPentagonalNumber(i));
        } else {
            System.out.printf("%-6d", getPentagonalNumber(i));
        }
    }
}

public static int getPentagonalNumber(int n) {
    return n * (3 * n - 1) / 2;
}


6.2 求整数各位数字之和

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一个整数:");
    Long num = scanner.nextLong();
    System.out.print(num + "的各位数字之和为:" + sumDigits(num));
}

public static int sumDigits(long n) {
    int sumTotal = 0;
    char ch;
    String str = String.valueOf(n).toString();
    for (int i = 0; i < str.length(); i++) {
        ch = str.charAt(i);
        sumTotal = sumTotal + Integer.parseInt(String.valueOf(ch));
    }
    return sumTotal;
}


6.3 回文整数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入一个整数值:");
    int num = scanner.nextInt();
    if (isPalindrome(num) == true) {
        System.out.println("这个数是回数");
    } else {
        System.out.println("这个数不是回数");
    }
}


public static boolean isPalindrome(int number) {
    return (number == reverse(number));
}

public static int reverse(int number) {
    int revNum = 0;
    while (number != 0) {
        revNum = number % 10 + (revNum * 10);
        number /= 10;
    }
    return revNum;
}


6.4 反方向显示一个整数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一个整数:");
    int num = scanner.nextInt();
    System.out.print("该数字的倒序输出为:" + reverse(num));
}

public static int reverse(int number) {
    int result = 0;
    while (number != 0) {
        result = (result * 10) + number % 10;
        number /= 10;
    }
    return result;
}


6.5 对三个数排序

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入三个数字:");
    double num1, num2, num3;
    num1 = scanner.nextDouble();
    num2 = scanner.nextDouble();
    num3 = scanner.nextDouble();
    displaySortedNumbers(num1, num2, num3);

}

public static void displaySortedNumbers(double num1, double num2, double num3) {
    double changeNum;
    if (num1 < num2) {
        changeNum = num1;
        num1 = num2;
        num2 = changeNum;
    }
    if (num2 < num3) {
        changeNum = num2;
        num2 = num3;
        num3 = changeNum;
    }
    if (num1 < num2) {
        changeNum = num1;
        num1 = num2;
        num2 = changeNum;
    }
    System.out.print("升序排列后的结果为:" + num3 + "," + num2 + "," + num1);
}


6.6 显示图案

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一个值:");
    int n = scanner.nextInt();
    displayPattern(n);
}

public static void displayPattern(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = n - i; j >= 1; j--) {
            System.out.printf("%3s", "");
        }
        for (int j = i; j >= 1; j--) {
            System.out.printf("%3d", j);
        }
        System.out.println();
    }
}


6.7 计算未来投资价值

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入投资额:");
    double investmentAmount = scanner.nextDouble();
    System.out.print("请输入年利率:");
    double monthlyInterestRate = scanner.nextDouble();
    monthlyInterestRate = monthlyInterestRate / 1200;
    System.out.printf("%-8s%15s\n", "Years", "Future Value");
    for (int i = 1; i <= 30; i++) {
        System.out.printf("%-8d%15.2f\n", i, futureInvestmentValue(investmentAmount, monthlyInterestRate, i));
    }
}

public static double futureInvestmentValue(double investmentAmount, double monthlyInterestRate, int years) {
    double futureInvestmentValue = investmentAmount * Math.pow((1 + monthlyInterestRate), (years * 12));
    return futureInvestmentValue;
}


6.8 摄氏度转换

public static void main(String[] args) {
    System.out.printf("%-8s%-8s%8s%8s\n", "摄氏度", "华氏度", "华氏度", "摄氏度");
    System.out.println("----------------------------------------");
    for (int tpr1 = 40, tpr2 = 120; tpr1 >= 31 && tpr2 >= 30; tpr1--, tpr2 -= 10) {
        System.out.printf("%-10.1f%-8.1f", (double) tpr1, celsiusToFahrenheit((double) tpr1));
        System.out.printf("%11.1f%11.2f\n", (double) tpr2, fahrenheitToCelsius((double) tpr2));
    }
}

public static double celsiusToFahrenheit(double celsius) {
    return (9.0 / 5) * celsius + 32;
}

public static double fahrenheitToCelsius(double fahrenheit) {
    return (5.0 / 9) * (fahrenheit - 32);
}


6.9 英尺转换

public static void main(String[] args) {
    System.out.printf("%-9s%-8s%10s%9s\n", "英尺", "米", "米", "英尺");
    System.out.println("----------------------------------------");
    for (int i = 1, j = 20; i <= 10 && j <= 65; i++, j += 5) {
        System.out.printf("%-10.1f%-8.3f", (double) i, footToMeter((double) i));
        System.out.printf("%11.1f%11.3f\n", (double) j, meterToFoot((double) j));
    }
}

public static double footToMeter(double foot) {
    return foot * 0.305;
}

public static double meterToFoot(double meter) {
    return meter * 3.279;
}


6.12 显示字符

public static void main(String[] args) {
    printChars('1', 'Z', 10);
}

public static void printChars(char ch1, char ch2, int numLine) {
    int num = 1;
    for (int i = (int) ch1; i <= (int) ch2; i++) {
        System.out.printf("%2c", (char) i);
        if (num % numLine == 0) {
            System.out.println();
        }
        num++;
    }
}


6.13 数列求和

public static void main(String[] args) {
    System.out.println("i" + "             " + "m(i)");
    System.out.println("--------------------");
    for (int i = 1; i <= 20; i++) {
        System.out.printf("%-2d%17.4f\n", i, subTotal(i));
    }
}

public static double subTotal(int i) {
    double result = 0;
    for (int j = 1; j <= i; j++) {
        result = result + ((double) j / ((double) j + 1));
    }
    return result;
}


6.14 估算π

public static void main(String[] args) {
    System.out.println("i" + "             " + "m(i)");
    System.out.println("-------------------");
    for (int i = 1; i <= 901; i += 100) {
        System.out.printf("%-3d%15.4f\n", i, getResult(i));
    }
}

public static double getResult(int i) {
    double result = 0;
    for (int j = 1; j <= i; j++) {
        result = result + Math.pow(-1, j + 1) / (2 * j - 1);
    }
    result = result * 4;
    return result;
}


6.16 一年的天数

public static void main(String[] args) {
    System.out.println("年份" + "            " + "天数");
    System.out.println("-------------------");
    for (int i = 2000; i <= 2020; i++) {
        System.out.printf("%-4d%14d\n", i, daysOfYear(i));
    }
}

public static int daysOfYear(int year) {
    if (isLeapYear(year)) {
        return 366;
    } else return 365;
}

public static boolean isLeapYear(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}


6.17 显示0和1构成的矩阵

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一个值:");
    int n = scanner.nextInt();
    printMatrix(n);
}

public static void printMatrix(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            System.out.print(Math.round(Math.random()) + " ");
        }
        System.out.println();
    }
}


6.18 检测密码

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入密码:");
    String str = scanner.nextLine();
    switch (checkPassword(str)) {
        case 0:
            System.out.print("密码必须是8位以上!");
            break;
        case 1:
            System.out.print("密码必须只包含字符和数字!");
            break;
        case 2:
            System.out.print("密码必须包含至少两个数字!");
            break;
        default:
            System.out.print("密码检验通过!");
            break;
    }

}

public static int checkPassword(String pwd) {
    int numDigit = 0;
    int numLetter = 0;
    if (pwd.length() >= 8) {
        for (int i = 0; i < pwd.length(); i++) {
            if (Character.isDigit(pwd.substring(i, i + 1).charAt(0)) ||
                Character.isLetter(pwd.substring(i, i + 1).charAt(0))) {
                if (Character.isDigit(pwd.substring(i, i + 1).charAt(0))) {
                    numDigit++;
                }
                if (Character.isLetter(pwd.substring(i, i + 1).charAt(0))) {
                    numLetter++;
                }
            } else {
                return 1;
            }
        }
        if (numDigit >= 2 && numLetter > 0) {
            return 3;
        } else if (numDigit >= 2 && numLetter == 0) {
            return 1;
        } else if (numDigit == 0 && numLetter > 0) {
            return 1;
        } else return 2;
    } else {
        return 0;
    }
}


6.20 字符串中字符的个数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入字符串:");
    String s = scanner.nextLine();
    System.out.println("该字符串中一共含有" + countLetters(s) + "个字母");
}

public static int countLetters(String s) {
    int num = 0;
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLetter(s.charAt(i))) {
            num++;
        }
    }
    return num;
}


6.21 电话按键盘

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入字符串:");
    String str = scanner.nextLine();
    System.out.print("对应的数字键盘为:" + changeToNum(str));
}

public static String changeToNum(String str) {
    StringBuffer toNumBuffer = new StringBuffer();
    for (int i = 0; i < str.length(); i++) {
        char ch = Character.toLowerCase(str.charAt(i));
        if (ch == 'a' || ch == 'b' || ch == 'c') {
            toNumBuffer.append("2");
        } else if (ch == 'd' || ch == 'e' || ch == 'f') {
            toNumBuffer.append("3");
        } else if (ch == 'g' || ch == 'h' || ch == 'i') {
            toNumBuffer.append("4");
        } else if (ch == 'j' || ch == 'k' || ch == 'l') {
            toNumBuffer.append("5");
        } else if (ch == 'm' || ch == 'n' || ch == 'o') {
            toNumBuffer.append("6");
        } else if (ch == 'p' || ch == 'q' || ch == 'r' || ch == 's') {
            toNumBuffer.append("7");
        } else if (ch == 't' || ch == 'u' || ch == 'v') {
            toNumBuffer.append("8");
        } else if (ch == 'w' || ch == 'x' || ch == 'y' || ch == 'z') {
            toNumBuffer.append("9");
        } else if (ch == ' ') {
            toNumBuffer.append("0");
        } else if (ch == '+') {
            toNumBuffer.append("*");
        } else {
            toNumBuffer.append(str.charAt(i));
        }
    }
    return toNumBuffer.toString();
}


6.23 指定字符的出现次数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一串字符:");
    String str = scanner.nextLine();
    System.out.print("请输入要计算的字符:");
    String strLetter = scanner.nextLine();
    char ch = strLetter.charAt(0);
    System.out.print(ch + "在" + str + "中出现的次数为:" + count(str, ch) + "次");
}

public static int count(String str, char ch) {
    int num = 0;
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == ch) {
            num++;
        }
    }
    return num;
}


6.25 将毫秒转换成小时数、分钟数和秒数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入毫秒:");
    long ms = scanner.nextLong();
    System.out.print("转换后的时间为:" + convertMillis(ms));
}


public static String convertMillis(long millis) {
    long totalSecond = millis / 1000;
    long hour = totalSecond / 3600;
    long min = (totalSecond - (hour * 3600)) / 60;
    long second = totalSecond - (hour * 3600) - (min * 60);
    return hour + ":" + min + ":" + second;
}


6.26 回文素数

public static void main(String[] args) {
    int num = 2;
    int count = 0;
    while (count < 100) {
        if (isPalindrome(num) && isPrime(num)) {
            count++;
            System.out.printf("%-7d", num);
            if (count % 10 == 0) {
                System.out.println();
            }
        }
        num++;
    }
}

private static boolean isPalindrome(int num) {
    int reNum = 0;
    int numTmp = num;
    while (numTmp != 0) {
        reNum = numTmp % 10 + (reNum * 10);
        numTmp = numTmp / 10;
    }
    return num == reNum;
}

private static boolean isPrime(int num) {
    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    return true;
}


6.27 反素数

public static void main(String[] args) {
    int num = 11;
    int count = 0;
    while (count < 100) {
        if (notPalindrome(num) && isPrime(num)) {
            count++;
            System.out.printf("%-7d", num);
            if (count % 10 == 0) {
                System.out.println();
            }
        }
        num++;
    }
}

private static boolean notPalindrome(int num) {
    int reNum = 0;
    int numTmp = num;
    while (numTmp != 0) {
        reNum = numTmp % 10 + (reNum * 10);
        numTmp = numTmp / 10;
    }
    return num != reNum;
}

private static boolean isPrime(int num) {
    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    int reNum = 0;
    while (num != 0) {
        reNum = num % 10 + (reNum * 10);
        num = num / 10;
    }
    for (int i = 2; i < reNum; i++) {
        if (reNum % i == 0)
            return false;
    }
    return true;
}


6.28 梅森素数

public static void main(String[] args) {
    System.out.println("p                2^p-1");
    System.out.println("----------------------");
    int num;
    for (int i = 2; i <= 31; i++) {
        num = (int) (Math.pow(2, i) - 1);
        if (isPrime(i) && isPrime(num)) {
            System.out.printf("%-2d%20d\n", i, num);
        }
    }
}

private static boolean isPrime(int num) {
    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    return true;
}


6.29 双素数

public static void main(String[] args) {
    for (int i = 2; i <= 998; i++) {
        if (isPrime(i) && isPrime(i + 2)) {
            System.out.println("(" + i + "," + (i + 2) + ")");
        }
    }
}

private static boolean isPrime(int num) {
    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    return true;
}


6.30 双骰子**

private static int count = 0;

public static void main(String[] args) {
    int num1 = (int) (Math.random() * 6) + 1;
    int num2 = (int) (Math.random() * 6) + 1;
    System.out.println("你投出了" + num1 + "+" + num2 + "=" + (num1 + num2));
    isWin(num1, num2);
    System.out.print("总共投掷了" + count + "次");
}

private static void isWin(int num1, int num2) {
    int sum = num1 + num2;
    if (sum == 2 || sum == 3 || sum == 12) {
        System.out.println("你输了!");
        count++;
    } else if (sum == 7 || sum == 11) {
        System.out.println("你赢了!");
        count++;
    } else {
        count++;
        int result = 0;
        while (result == 0) {
            System.out.print("请继续!");
            Scanner scanner = new Scanner(System.in);
            scanner.nextLine();
            result = playAgain(num1, num2);
            count++;
        }
    }
}

private static int playAgain(int num1, int num2) {
    int sum = num1 + num2;
    int num1_new = (int) (Math.random() * 6) + 1;
    int num2_new = (int) (Math.random() * 6) + 1;
    System.out.println("你投出了" + num1_new + "+" + num2_new + "=" + (num1_new + num2_new));
    if (num1_new + num2_new == sum) {
        System.out.println("你赢了!");
        return 1;
    } else if (num1_new + num2_new == 7) {
        System.out.println("你输了!");
        return 1;
    } else {
        return 0;
    }
}


6.31 信用卡号的合法性

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("请输入16位银行卡号:");
    long cardNum = input.nextLong();
    if (isValidCard(cardNum)) {
        System.out.print("此卡号有效!");
    } else {
        System.out.print("此卡号无效!");
    }
}

private static boolean isValidCard(long cardNum) {
    return (oddCount(cardNum) + evenCount(cardNum)) % 10 == 0;
}

private static int oddCount(long cardNum) {
    int oddCount = 0;
    int odd;
    char oddChar;
    for (int i = 15; i >= 1; i = i - 2) {
        oddChar = String.valueOf(cardNum).charAt(i);
        odd = Integer.parseInt(String.valueOf(oddChar));
        oddCount = oddCount + odd;
    }
    return oddCount;
}

private static int evenCount(long cardNum) {
    int evenCount = 0;
    int even;
    int evenNew;
    char evenChar;
    for (int i = 14; i >= 0; i = i - 2) {
        evenChar = String.valueOf(cardNum).charAt(i);
        even = Integer.parseInt(String.valueOf(evenChar));
        if (even * 2 >= 10) {
            evenNew = even * 2 - 9;
        } else {
            evenNew = even * 2;
        }
        evenCount = evenCount + evenNew;
    }
    return evenCount;
}


6.32 骰子的游戏统计

private static int count = 0;

public static void main(String[] args) {
    for (int i = 1; i <= 1000; i++) {
        startPlay();
    }
    System.out.print("总共投掷了" + count + "次");
}

private static void startPlay() {
    int num1 = (int) (Math.random() * 6) + 1;
    int num2 = (int) (Math.random() * 6) + 1;
    System.out.println("你投出了" + num1 + "+" + num2 + "=" + (num1 + num2));
    isWin(num1, num2);
}

private static void isWin(int num1, int num2) {
    int sum = num1 + num2;
    if (sum == 2 || sum == 3 || sum == 12) {
        System.out.println("你输了!");
        count++;
    } else if (sum == 7 || sum == 11) {
        System.out.println("你赢了!");
        count++;
    } else {
        count++;
        int result = 0;
        while (result == 0) {
            System.out.print("请继续!");
            result = playAgain(num1, num2);
            count++;
        }
    }
}

private static int playAgain(int num1, int num2) {
    int sum = num1 + num2;
    int num1_new = (int) (Math.random() * 6) + 1;
    int num2_new = (int) (Math.random() * 6) + 1;
    System.out.println("你投出了" + num1_new + "+" + num2_new + "=" + (num1_new + num2_new));
    if (num1_new + num2_new == sum) {
        System.out.println("你赢了!");
        return 1;
    } else if (num1_new + num2_new == 7) {
        System.out.println("你输了!");
        return 1;
    } else {
        return 0;
    }
}


6.35 五边形的面积

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入五边形的边长:");
    double side = scanner.nextDouble();
    System.out.print("面积为:" + area(side));
}

private static double area(double side) {
    return Math.round((5 * Math.pow(side, 2)) / (4 * Math.tan(Math.PI / 5)) * 100) / 100d;
}


6.36 正多边形的面积

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入多边形的边数:");
    int n = scanner.nextInt();
    System.out.print("请输入多边形的边长:");
    double side = scanner.nextDouble();
    System.out.print("面积为:" + area(n, side));
}

private static double area(int n, double side) {
    return Math.round((n * Math.pow(side, 2)) / (4 * Math.tan(Math.PI / n)) * 100) / 100d;
}


6.37 格式化整数

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入一个整数:");
    int number = scanner.nextInt();
    System.out.print("请输入前缀字符串个数:");
    int width = scanner.nextInt();
    System.out.print("格式化后为:" + format(number, width));
}

private static String format(int number, int width) {
    StringBuffer str = new StringBuffer();
    for (int i = 1; i <= width - String.valueOf(number).length(); i++) {
        str = str.append("0");
    }
    str.append(String.valueOf(number));
    return str.toString();
}


6.38 生成随机字符

public static void main(String[] args) {
    for (int i = 1; i <= 100; i++) {
        System.out.print(getRandomUpperCaseLetter() + " ");
        if (i % 10 == 0) {
            System.out.println();
        }
    }
    for (int i = 1; i <= 100; i++) {
        System.out.print(getRandomDigitCharacter() + " ");
        if (i % 10 == 0) {
            System.out.println();
        }
    }
}

private static char getRandomUpperCaseLetter() {
    return getRandomCharacter('A', 'Z');
}

private static char getRandomDigitCharacter() {
    return getRandomCharacter('0', '9');
}

private static char getRandomCharacter(char ch1, char ch2) {
    return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
}


Java语言程序设计(基础篇)(原书第10版) 练习题答案 第6章