第六章第二十二题(数学:平方根的近似求法)(Math: approximate the square root) – 编程练习题答案

**6.22(数学:平方根的近似求法)有几种实现Math类中sqrt方法的技术。其中一个称为巴比伦法。它通过使用下面的公式反复计算近似地得到一个数字n的平方根:

nextGuess = (lastGuess + n / lastGuess) / 2

当nextGuess和lastGuess几乎相同时,nextGuess就是平方根的近似值。最初的猜测值可以是任意一个正值(例如1)。这个值就是lastGuess的初始值。如果nextGuess和lastGuess的差小于很小的数,比如0.0001,就可以认为nextGuess是n的平方根的近似值;否则,nextGuess就成为lastGuess,求近似值的过程继续执行。实现下面的方法,返回n的平方根。

public static double sqrt(long n)

**6.22(Math: approximate the square root) There are several techniques for implementing the sqrt method in the Math class. One such technique is known as the Babylonian method. It approximates the square root of a number, n, by repeatedly performing the calculation using the following formula:

nextGuess = (lastGuess + n / lastGuess) / 2

When nextGuess and lastGuess are almost identical, nextGuess is the approximated square root. The initial guess can be any positive value (e.g., 1). This value will be the starting value for lastGuess. If the difference between nextGuess and lastGuess is less than a very small number, such as 0.0001, you can claim that nextGuess is the approximated square root of n. If not, nextGuess becomes lastGuess and the approximation process continues. Implement the following method that returns the square root of n:

public static double sqrt(long n)

下面是参考答案代码:

public class Ans6_22_page202 {
    public static void main(String[] args) {
        System.out.println(sqrt(2));
    }
    public static double sqrt(long n) {
        double Guess;
        double nextGuess = 1;
        do {
            Guess = nextGuess;
            nextGuess = (Guess + n / Guess) / 2;
        } while (Guess - nextGuess >= 0.0001 || nextGuess - Guess >= 0.0001);
        return nextGuess;
    }
}

适用Java语言程序设计与数据结构(基础篇)(原书第11版)Java语言程序设计(基础篇)(原书第10/11版)

第六章第二十一题(电话按键盘)(Phone keypads) – 编程练习题答案

*6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示,编写一个方法,返回给定大写字母的数字,如下所示:

int getNumber(char uppercaseLetter)

编写一个测试程序,提示用户输入字符串形式的电话号码。输入的数字可能会包含字母。程序将字母(大写或者小写)翻译成一个数字,然后保持其他字符不变。

*6.21(Phone keypads)The international standard letter/number mapping for telephones is given in Programming Exercise 4.15. Write a method that returns a number, given an uppercase letter, as follows:

int getNumber(char uppercaseLetter)

Write a test program that prompts the user to enter a phone number as a string. The input number may contain letters. The program translates a letter (uppercase or lowercase) to a digit and leaves all other characters intact.

下面是参考答案代码:

import java.util.Scanner;

public class Ans6_21_page201 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a string: ");
        String phoneNumber = input.nextLine().toUpperCase();
        for (int i =0; i < phoneNumber.length(); i++) {
            if (Character.isDigit(phoneNumber.charAt(i))) {
                System.out.print(phoneNumber.charAt(i));
            }
            else if (getNumber(phoneNumber.charAt(i)) == 1)
                System.out.print("-");
            else
                System.out.print(getNumber(phoneNumber.charAt(i)));
        }
    }
    public static int getNumber(char uppercaseLetter) {
        int num = 99;
        switch (uppercaseLetter+"") {
            case "-":
                num = 1;
                break;
            case "A":
                num = 2;
                break;
            case "B":
                num = 2;
                break;
            case "C":
                num = 2;
                break;
            case "D":
                num = 3;
                break;
            case "E":
                num = 3;
                break;
            case "F":
                num = 3;
                break;
            case "G":
                num = 4;
                break;
            case "H":
                num = 4;
                break;
            case "I":
                num = 4;
                break;
            case "J":
                num = 5;
                break;
            case "K":
                num = 5;
                break;
            case "L":
                num = 5;
                break;
            case "M":
                num = 6;
                break;
            case "N":
                num = 6;
                break;
            case "O":
                num = 6;
                break;
            case "P":
                num = 7;
                break;
            case "Q":
                num = 7;
                break;
            case "R":
                num = 7;
                break;
            case "S":
                num = 7;
                break;
            case "T":
                num = 8;
                break;
            case "U":
                num = 8;
                break;
            case "V":
                num = 8;
                break;
            case "W":
                num = 9;
                break;
            case "X":
                num = 9;
                break;
            case "Y":
                num = 9;
                break;
            case "Z":
                num = 9;
        }
        return num;
    }
}

适用Java语言程序设计与数据结构(基础篇)(原书第11版)Java语言程序设计(基础篇)(原书第10/11版)

第六章第二十题(计算一个字符串中字母的个数)(Count the letters in a string) – 编程练习题答案

*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法头计算字符串中的字母个数:
public static int countLetters(String s)

编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数。
*6.20(Count the letters in a string) Write a method that counts the number of letters in a string using the following header:
public static int countLetters(String s)

Write a test program that prompts the user to enter a string and displays the number of letters in the string.

下面是参考答案代码:

import java.util.Scanner;

public class Ans6_20_page201 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter : ");
        String s = input.nextLine();
        System.out.println("The number of letters is "+ countLetters(s));
    }
    public static int countLetters(String s) {
        int count = 0;
        for (int i = 0;i < s.length();i++) {
            if (Character.isLetter(s.charAt(i)))
                count++;
        }
        return count;
    }
}

适用Java语言程序设计与数据结构(基础篇)(原书第11版)Java语言程序设计(基础篇)(原书第10/11版)

Java精确计算闰年

闰年366天(2月中多一天),闰年2月29天
普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年)
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)

import java.util.Scanner;
public class LeapYear {
    public static void main(String[] args) {    
        Scanner input = new Scanner(System.in);
        System.out.print("输入年份:");
        int year = input.nextInt();
         
        if((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0)
            System.out.print(year + "年是闰年");
        else 
            System.out.print(year + "年不是闰年");
    }
}

Math.random()随机整数错误用法

public class Ans3_4_page93{
    public static void main(String[] args){
        //错误用法 导致month的值等于0,永不等于12,可以把12改成13
        //可用于抽奖排除中奖号码
        int month = (int)(Math.random() * 12);

        switch (month) {
            case 1:
                System.out.println("January");
                break;
            case 2:
                System.out.println("February");
                break;
            case 3:
                System.out.println("March");
                break;
            case 4:
                System.out.println("April");
                break;
            case 5:
                System.out.println("May");
                break;
            case 6:
                System.out.println("June");
                break;
            case 7:
                System.out.println("July");
                break;
            case 8:
                System.out.println("August");
                break;
            case 9:
                System.out.println("September");
                break;
            case 10:
                System.out.println("October");
                break;
            case 11:
                System.out.println("November");
                break;
            case 12:
                System.out.println("December");
                break;
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        while (true) {
            double number0 = Math.random();
            double number1 = number0 * 12;
            int number = (int) (number1);
            System.out.println("原始数      " + number0);
            System.out.println("原始数乘以12 " + number1);
            System.out.println(number);
            System.out.println("---------------------");
        }
    }
    }

原始数      3.111564749883611E-4
原始数乘以12 0.003733877699860333
0
---------------------
原始数      0.07859998705330462
原始数乘以12 0.9431998446396554
0
---------------------

Process finished with exit code -1

Java移位运算符>>和无符号右移运算符>>>的区别

Java 移位运算符是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
左移使用两个小于符号”<<“表示,右移使用两个大于符号”>>”表示。
应用逻辑移位时,移位后空缺的部分全部填0。原码为整数,补码为负数,补码=反码+1。

无符号右移指的是,右移后前面补零,如:
-1的补码为11111111111111111111111111111111,>>>2=0011111111111111111111111111111111。

最高位 1表示负数,0表示整数。

>> 符号右移时,对于正数,高位补0,对于负数,高位补1。
>>>无符号右移,长度扩展为4字节,最高位都为0,但正数扩展位补0,负数扩展位补1。

   0001(十进制1)
<<    3(左移3位)
 = 1000(十进制8)

    1010(十进制10)
>>    2(右移2位)
 = 0010(十进制2)

 1010           原始数         number
10100           左移一位       number = number << 1;
 1010           右移一位       number = number >> 1;