继续熟悉 Java 语法

OOP h03

0x00 问题描述及解决方法

判断一个数是否是水仙花数

所谓「水仙花数」是指一个三位数,其各位数字立方和等于该数本身。例如:153 是一个水仙花数,因为 $153=1^3+5^3+3^3$

分解,根据定义判断。

1
2
3
4
5
6
7
8
public static boolean isNarcissisticNum(int i) {
// 完成本函数里面的代码
int a, b, c;
a = i % 10;
b = i % 100 / 10;
c = i / 100;
return i == Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3);
}

判断一个数是否是完全数

一个数如果恰好等于它的因子之和,这个数就称为「完全数」

找因子,求和,根据定义判断。

1
2
3
4
5
6
7
8
9
10
public static boolean Perfectnumber(int i) {
// 完成本函数里面的代码
int sum = 1;
int j;
for (j = 2; j < Math.sqrt(i); j++)
if (i % j == 0) {
sum += j + i / j;
}
return i == sum;
}

计算 n 的阶乘(n >= 0,且结果不会超出整数范围)

直接计算。

1
2
3
4
5
6
7
public static int factorial(int n) {
int pro = 1;
int i;
for (i = 2; i <= n; i++)
pro *= i;
return pro;
}

将一个二进制的数变成十进制的数字

调用方法 Integer.valueOf,注意转换为字符串返回。

1
2
3
4
5
6
7
8
public static String binToDec(String bin) {
//如何把一个字符串转换为整数,供参考
int i=Integer.valueOf("1");
//如何把一个整数转换为字符串,供参考
String s=String.valueOf(i);
// 完成本函数里面的代码
return Integer.valueOf(bin, 2).toString();
}

设二元一次方程 $ax^2+bx+c=0$ 的系数分别为 a, b, c,请将这个方程的两个实数根放在数组中返回,如果没有实数解则返回 null

例如 getRoot(1,-2,1) 返回 {1,1}

例如 getRoot(1,-2,2) 返回 null

求根公式。

1
2
3
4
5
6
7
8
9
public static double[] getRoot(double a,double b,double c) {
double[] ans = new double[2];
double delta2 = b * b - 4 * a * c;
if (delta2 < 0)
return null;
ans[0] = (-b + Math.sqrt(delta2)) / a / 2;
ans[1] = (-b - Math.sqrt(delta2)) / a / 2;
return ans;
}

返回杨辉三角第 i 行的系数,杨辉三角第一行定义为 1

提示:从顶部的单个 1 开始,下面一行中的每个数字都是上面两个数字的和

例如 getPascalTriangle(1) 返回 {1}getPascalTriangle(2) 返回 {1,1}

测试的时候,系数肯定不会超过 int 的范围

打表输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static int[] getPascalTriangle(int i) {
int[][] ans = new int[i][i];
int j, k;
for (j = 0; j < i; j++) {
ans[j][0] = 1;
ans[j][j] = 1;
}
for (j = 1; j < i; j++) {
for (k = 1; k <= j; k++)
ans[j][k] = ans[j - 1][k - 1] + ans[j - 1][k];
}
return ans[i - 1];
}

去掉一个字符串中所有的空格

只需将字符串中的空格替换为空,调用 replaceAll 方法。

1
2
3
4
public static String zipSpace(String str) {
// 完成本函数里面的代码
return str.replaceAll(" ", "");
}

0x01 总结

完整代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
*
*/
package com.huawei.classroom.student.h03;

/**
* @author super
*
*/
public class Home03 {

/**
* 判断一个数是否是水仙花数,
* 所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
* 难度系数2星
* @param i
* @return
*/
public static boolean isNarcissisticNum(int i) {
// 完成本函数里面的代码
int a, b, c;
a = i % 10;
b = i % 100 / 10;
c = i / 100;
return i == Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3);
}

/**
* 判断一个数是否是完全数,如果不清楚完全数,可以百度
* 一个数如果恰好等于它的因子之和,这个数就称为 "完全数 "。
* 难度系数2星
* @param i
* @return
*/
public static boolean Perfectnumber(int i) {
// 完成本函数里面的代码
int sum = 1;
int j;
for (j = 2; j < Math.sqrt(i); j++)
if (i % j == 0) {
sum += j + i / j;
}
return i == sum;
}

/**
* 计算n的阶乘(n>=0,且结果不会超出整数范围)
* @param n
* @return
*/
public static int factorial(int n) {
int pro = 1;
int i;
for (i = 2; i <= n; i++)
pro *= i;
return pro;
}

/**
* 将一个二进制的数变成10进制的数字
* 例如将 1000 转换为 8,将10000 转换为16
* @return
*/
public static String binToDec(String bin) {
//如何把一个字符串转换为整数,供参考
int i=Integer.valueOf("1");
//如何把一个整数转换为字符串,供参考
String s=String.valueOf(i);
// 完成本函数里面的代码
return Integer.valueOf(bin, 2).toString();
}

/**
* 设二元一次方程 a*x*x+bx+c=0;
* 的系数分别为a,b,c
* 请将这个方程的两个实数根放在数组中返回,如果没有实数解则返回null
* 例如 getRoot(1,-2,1)返回 {1,1}
* 例如 getRoot(1,-2,2)返回 null
* 难度系数1星
* @return
*/
public static double[] getRoot(double a,double b,double c) {
double[] ans = new double[2];
double delta2 = b * b - 4 * a * c;
if (delta2 < 0)
return null;
ans[0] = (-b + Math.sqrt(delta2)) / a / 2;
ans[1] = (-b - Math.sqrt(delta2)) / a / 2;
return ans;
}

/**
* 返回杨辉三角( Pascal triangle,请百度 杨辉三角 或者 Pascal triangle )第i行的系数,杨辉三角第一行定义为1
* 提示:从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和
* 例如getPascalTriangle(1)返回{1},
* getPascalTriangle(2)返回{1,1}
* 测试的时候,系数肯定不会超过int的范围
* 难度系数3星
* @param i
* @return
*/
public static int[] getPascalTriangle(int i) {
int[][] ans = new int[i][i];
int j, k;
for (j = 0; j < i; j++) {
ans[j][0] = 1;
ans[j][j] = 1;
}
for (j = 1; j < i; j++) {
for (k = 1; k <= j; k++)
ans[j][k] = ans[j - 1][k - 1] + ans[j - 1][k];
}
return ans[i - 1];
}

/**
* 去掉一个字符串中所有的空格
* 难度系数1星
* 例如:zipSpace(" a b c ")返回 "abc"
* @return
*/
public static String zipSpace(String str) {
// 完成本函数里面的代码
return str.replaceAll(" ", "");
}
}