我正试图创建一个程序,打印出n=100以内的五边形数字。对于n=1、2、3,五边形数被定义为n(3n-1)/2,因此第一个五边形数字将是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{
}
}
}
这只是我上面程序的一部分。我现在有两个问题:
- 我不知道如何正确执行操作顺序。我所做的是将运算n(3n-1)/2分解为part_one和part_two。这种做法好吗
- 看看while循环中的嵌套if,我试图测试
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
。
除了语法之外,您在检测双精度是否为整数时是正确的。
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
,以避免溢出。