我正在尝试创建一个程序,打印出五边形数字,直到n = 100.五边形数字定义为n(3n-1)/ 2,n = 1,2,3,因此第一个五边形数字将为1, 5,12,22 ..等等
package mathematical.functions.test;
import java.util.Scanner;
public class MathematicalFunctionsTest {
public static int getPentagonalNumber(int n) {
int i = 0;
double part_one = (3 * n) - 1;
double part_two = part_one / 2;
while (i < 100){
if (part_two == int(part_two))
{
System.out.println(n);
i++;
}
else{
}
}
}
这只是我上面程序的一部分。我现在有两个问题:
part_two
是否为整数(即没有小数)。我尝试了很多东西,但Java并没有让我包括%
运算符。你错过了等式的一部分(n因子)。您可以将它们组合成一个语句,如下所示:
double num = n * (3 * n - 1) / 2
只需按照通常的方式使用括号即可。 Java了解正确的操作顺序。
请尝试以下方法检查数字是否为int:
if ((num == Math.floor(num)) && !Double.isInfinite(num)) {
// integral type
}
这通过地板(截断十进制)数字并检查它是否与原始数字相同来工作。它还有额外的检查,以确保数量是有限的。
我不知道如何正确实施运营秩序。我所做的是将操作n(3n - 1)/ 2分解为part_one和part_two。这是好习惯吗?
是的,可以这样做。或者,您可以使用()
并按如下方式执行:
double part_one = n * (3 * n - 1) / 2;
查看while循环中的嵌套if,我试图测试part_two是否为整数(即没有小数)。我尝试了很多东西,但Java并没有让我这么做。我也试过使用%运算符。但它并没有让我这么做。
我不知道用例,但是如果你想查看它是否可以解析为Integer,那么你可以这样做:
while (i < 100){
String str = String.valueOf(part_two);
int conv = Integer.parseInt(str.substring(0, str.indexOf("."))));
if(part_two - conv == 0) {
/* Yes */
} else {
/* No */
}
}
正如其他人所说,你的等式的语法并不困难。 n(3n-1)/2
会变成n * (3*n - 1) / 2
虽然如果你想要一个正确的双重,你想让其中一个数字成为一个双,否则每个答案将成为一个整数n * (3.0*n - 1) / 2.0
。
你是否正确检测double是否为整数,除了语法。
public static boolean isInteger(double d) {
return d == (int) d;
}
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
double num = i * (3.0*i- 1) / 2.0;
if(isInteger(num)) System.out.println("("+i+", "+num+")");
}
/* Result:
(1, 1.0)
(2, 5.0)
(3, 12.0)
(4, 22.0)
(5, 35.0)
(6, 51.0)
(7, 70.0)
(8, 92.0)
(9, 117.0)
*/
}
如果你将它用于真正的大数字,大于100,我建议第一部分是n/2
,第二部分是3*n - 1
,以避免溢出。