目录
Demo71 (MyTriangle类)创建一个名为MyTriangle的类,它包含如下两个方法: 编写一个测试程序,读入三角形三边的值,若输入有效,则计算面积;否则显示输入无效。
Demo73 (数学:平方根的近似求法)有几种实现Math类中sqrt方法的技术。其中一个称为巴比伦法。
Demo76 (梅森素数) 如果一个素数可以写成(2^p)-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下的输出结果:
Demo77 (双素数) 双素数是指一对差值为2的素数。例如:3和5就是一对双素数,5和7是一对双素数,而11和13也是一对双素数。编写程序,找出小于1000的所有双素数。
Demo78 (几何问题:五边形的面积) 编写一个方法,使用下面的方法头来返回五边形的面积。编写一个主方法,提示用户输入五边形的边,然后显示它的面积。
三角形面积的计算公式在编程练习题Demo16中给出。
s = (边1 + 边2 + 边3 ) / 2
面积 = √(s(s - 边1)(s - 边2)(s - 边3))
- package Exer2;
-
- import java.util.Scanner;
-
- public class Demo71 {
- /*
- (MyTriangle类)创建一个名为MyTriangle的类,它包含如下两个方法:
- 编写一个测试程序,读入三角形三边的值,若输入有效,则计算面积;否则显示输入无效。
- 三角形面积的计算公式在编程练习题2.19中给出。
- s = (边1 + 边2 + 边3 ) / 2
- 面积 = √(s(s - 边1)(s - 边2)(s - 边3))
- */
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- System.out.println("请输入三角形的三边长:");
- double side1 = scanner.nextInt();
- double side2 = scanner.nextInt();
- double side3 = scanner.nextInt();
- if (isValid(side1, side2, side3)) {
- double area = area(side1, side2, side3);
- System.out.println("三角形的面积为:" + area);
- } else {
- System.out.println("输入无效!");
- }
- }
-
- /* Return true if the sum of any two sides is greater than the third side. */
- public static boolean isValid(double side1, double side2, double side3) {
- return side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1;
- }
-
- /* Return the area of the triangle. */
- public static double area(double side1, double side2, double side3) {
- double s = (side1 + side2 + side3) / 2;
- return Math.pow(s * (s - side1) * (s - side2) * (s - side3), 0.5);
- }
- }
结果:
- package Exer2;
-
- import java.util.Scanner;
-
- public class Demo72 {
- /*
- (计算一个字符串中字母的个数)编写一个方法,使用下面的方法头计算字符串中的字母个数:
- public static int countLetters(String s)
- 编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数。
- */
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- System.out.print("请输入一个字符串:");
- String str = scan.nextLine();
- System.out.println(str + " 中的字母个数:" + countLetters(str));
- scan.close();
- }
-
- 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;
- }
- }
结果:
它通过使用下面公式的反复计算近似地得到: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)
- package Exer2;
-
- public class Demo73 {
- public static void main(String[] args) {
- System.out.println(sqrt(5));
- }
-
- public static double sqrt(long n) {
- double lastGuess = 1;
- double nextGuess = (lastGuess + n / lastGuess) / 2;
- while (true) {
- if (Math.abs(lastGuess - nextGuess) < 0.0001) {
- break;
- } else {
- lastGuess = nextGuess;
- nextGuess = (lastGuess + n / lastGuess) / 2;
- }
- }
- return nextGuess;
- }
- }
结果:
如下所示:
2 3 5 7 11 101 131 151 181 191
313 353 373 383 727 757 787 797 919 929
- package Exer2;
-
- public class Demo74 {
- /*
- (回文素数)回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文素数。数字313和757也是如此。
- 编写程序,显示前100个回文素数。每行显示10个数并且准确对齐,数字中间用空格隔开。
- 如下所示:
- 2 3 5 7 11 101 131 151 181 191
- 313 353 373 383 727 757 787 797 919 929
- */
- public static void main(String[] args) {
- isPalindromeAndPrimeNum();
- }
-
- public static void isPalindromeAndPrimeNum() {
- int count = 0;
- for (int i = 2; i < 1000000; i++) {
- boolean isFlag = true;
- for (int j = 2; j <= i / 2; j++) {
- if (i % j == 0) {
- isFlag = false;
- break;
- }
- }
- if (isFlag && reverse(i) == i) {
- count++;
- System.out.print(i + " \t ");
- if (count % 10 == 0) {
- System.out.println();
- }
- }
- if (count == 100) {
- break;
- }
- }
- }
-
- public static int reverse(int number) {
- int reverseNum = 0;
- while (number > 0) {
- reverseNum *= 10;
- reverseNum += number % 10;
- number /= 10;
- }
- return reverseNum;
- }
- }
结果:
如下所示:
13 17 31 37 71 73 79 97 107113
149 157167179 199 311 337 347 359 389
- package Exer2;
-
- public class Demo75 {
- /*
- (反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。
- 例如:17是一个素数,而71也是一个素数,所以17和71是反素数。
- 编写程序,显示前100个反素数。每行显示10个,并且数字间用空格隔开,
- 如下所示:
- 13 17 31 37 71 73 79 97 107 113
- 149 157167179 199 311 337 347 359 389
- */
- public static void main(String[] args) {
- isEmirp();
- }
-
- private static void isEmirp() {
- int count = 0;
- for (int i = 2; i < 10000; i++) {
- boolean isFlag = true;
- for (int j = 2; j <= i / 2; j++) {
- if (i % j == 0) {
- isFlag = false;
- break;
- }
- }
- if (isFlag && reverse(i) != i && isPrimeNum(reverse(i))) {
- count++;
- System.out.print(i + " \t");
- if (count % 10 == 0) {
- System.out.println();
- }
- }
- if (count == 100) {
- break;
- }
- }
- }
-
- public static boolean isPrimeNum(int number) {
- for (int i = 2; i <= number / 2; i++) {
- if (number % i == 0) {
- return false;
- }
- }
- return true;
- }
-
- private static int reverse(int number) {
- int reverseNum = 0;
- while (number > 0) {
- reverseNum = reverseNum * 10 + number % 10;
- number /= 10;
- }
- return reverseNum;
- }
- }
结果:
- package Exer2;
-
- public class Demo76 {
- /*
- (梅森素数) 如果一个素数可以写成(2^p)-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。\
- 编写程序,找出p≤31的所有梅森素数,然后显示如下的输出结果:
- */
- public static void main(String[] args) {
- printMersennePrime();
- }
-
- private static void printMersennePrime() {
- System.out.printf("%s\t\t%s%n","p", "2^p-1");
- System.out.println("________________");
- for (int p = 2; p <= 31; p++) {
- if (isPrimeNum((int)((Math.pow(2, p)) - 1))) {
- System.out.printf("%s\t\t%s%n",p, (int)((Math.pow(2, p)) - 1));
- }
- }
- }
-
- private static boolean isPrimeNum(int number) {
- for (int i = 2; i < number / 2; i++) {
- if (number % i == 0) {
- return false;
- }
- }
- return true;
- }
- }
结果:
显示结果如下所示:
(3, 5)
(5, 7)
......
- package Exer2;
-
- public class Demo78 {
- /*
- (双素数) 双素数是指一对差值为2的素数。
- 例如:3和5就是一对双素数,5和7是一对双素数,而11和13也是一对双素数。
- 编写程序,找出小于1000的所有双素数。
- */
- public static void main(String[] args) {
- for (int i = 2; i < 1000; i++) {
- if (isPrimeNum(i) && isPrimeNum(i + 2)) {
- System.out.printf("(%s, %s)%n", i, i + 2);
- }
- }
- }
-
- private static boolean isPrimeNum(int num) {
- for (int i = 2; i <= num / 2; i++) {
- if (num % i == 0) {
- return false;
- }
- }
- return true;
- }
- }
结果:
五边形的面积可以使用下面的公式计算:面积 = (5 × s²) / (4 × tan(π / 5))
public static double area(double side)
下面是一个运行示例:
- package Exer2;
-
- import java.util.Scanner;
-
- public class Demo78 {
- /*
- (几何问题:五边形的面积) 编写一个方法,使用下面的方法头来返回五边形的面积。
- 编写一个主方法,提示用户输入五边形的边,然后显示它的面积。
- 五边形的面积可以使用下面的公式计算:面积 = (5 × s²) / (4 × tan(π / 5))
- public static double area(double side)
- */
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入从五边形的边长:");
- double side = scan.nextDouble();
- double area = area(side);
- System.out.println(area);
- scan.close();
- }
-
- public static double area(double side) {
- double area;
- area = (5 * Math.pow(side, 2)) / (4 * Math.tan(Math.PI / 5));
- return area;
- }
- }
结果:
计算正多边形面积的公式是:面积 = (n × s²) / (4 × tan(π / n))
使用下面的方法头编写方法,返回正多边形的面积:public static double area(int n,double side)
下面是一个运行示例:
- package Exer2;
-
- import java.util.Scanner;
-
- public class Demo79 {
- /*
- (几何问题:正多边形的面积) 正多边形是一个n条边的多边形,它的每条边的长度都相等,
- 而且所有角的角度也相等(即多边形既是等边又等角的)。
- 编写一个main方法,提示用户输人边的个数以及正多边形的边长,然后显示它的面积。
- 计算正多边形面积的公式是:面积 = (n × s²) / (4 × tan(π / n))
- 使用下面的方法头编写方法,返回正多边形的面积:
- public static double area(int n,double side)
- */
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入正多边形边的个数:");
- int n = scan.nextInt();
- System.out.println("请输入正多边形的边长:");
- double side = scan.nextDouble();
- double area = area(n, side);
- System.out.println("正多边形的面积为:" + area);
- scan.close();
- }
-
- public static double area(int n, double side) {
- return (n * Math.pow(side, 2)) / (4 * Math.tan(Math.PI / n));
- }
- }
结果:
- package Exer2;
-
- import java.util.Scanner;
-
- public class Demo80 {
- /*
- 递归解决斐波那契数列
- */
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入项数:");
- int n = scan.nextInt();
- System.out.println(fibonacci(n));
- scan.close();
- }
-
- private static int fibonacci(int n) {
- if (n == 0) {
- return 0;
- }
- if (n == 1) {
- return 1;
- }
- return fibonacci(n - 1) + fibonacci(n - 2);
- }
- }
结果: