目录
Demo71 (MyTriangle类)创建一个名为MyTriangle的类,它包含如下两个方法: 编写一个测试程序,读入三角形三边的值,若输入有效,则计算面积;否则显示输入无效。
Demo73 (数学:平方根的近似求法)有几种实现Math类中sqrt方法的技术。其中一个称为巴比伦法。
Demo76 (梅森素数) 如果一个素数可以写成(2^p)-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下的输出结果:
Demo77 (双素数) 双素数是指一对差值为2的素数。例如:3和5就是一对双素数,5和7是一对双素数,而11和13也是一对双素数。编写程序,找出小于1000的所有双素数。
Demo78 (几何问题:五边形的面积) 编写一个方法,使用下面的方法头来返回五边形的面积。编写一个主方法,提示用户输入五边形的边,然后显示它的面积。
Demo71 (MyTriangle类)创建一个名为MyTriangle的类,它包含如下两个方法: 编写一个测试程序,读入三角形三边的值,若输入有效,则计算面积;否则显示输入无效。
三角形面积的计算公式在编程练习题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);
}
}
结果:
Demo72 (计算一个字符串中字母的个数)编写一个方法,使用下面的方法头计算字符串中的字母个数:public static int countLetters(String s),编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数。
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;
}
}
结果:
Demo73 (数学:平方根的近似求法)有几种实现Math类中sqrt方法的技术。其中一个称为巴比伦法。
它通过使用下面公式的反复计算近似地得到: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;
}
}
结果:
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
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;
}
}
结果:
Demo75 (反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。例如:17是一个素数,而71也是一个素数,所以17和71是反素数。编写程序,显示前100个反素数。每行显示10个,并且数字间用空格隔开
如下所示:
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;
}
}
结果:
Demo76 (梅森素数) 如果一个素数可以写成(2^p)-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下的输出结果:
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;
}
}
结果:
Demo77 (双素数) 双素数是指一对差值为2的素数。例如:3和5就是一对双素数,5和7是一对双素数,而11和13也是一对双素数。编写程序,找出小于1000的所有双素数。
显示结果如下所示:
(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;
}
}
结果:
Demo78 (几何问题:五边形的面积) 编写一个方法,使用下面的方法头来返回五边形的面积。编写一个主方法,提示用户输入五边形的边,然后显示它的面积。
五边形的面积可以使用下面的公式计算:面积 = (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;
}
}
结果:
Demo79 (几何问题:正多边形的面积) 正多边形是一个n条边的多边形,它的每条边的长度都相等,而且所有角的角度也相等(即多边形既是等边又等角的)。编写一个main方法,提示用户输人边的个数以及正多边形的边长,然后显示它的面积。
计算正多边形面积的公式是:面积 = (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));
}
}
结果:
Demo80 递归解决斐波那契数列
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);
}
}
结果: