改进操作顺序并测试值是否有小数



我正试图创建一个程序,打印出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{                
        } 
    }
}

这只是我上面程序的一部分。我现在有两个问题:

  1. 我不知道如何正确执行操作顺序。我所做的是将运算n(3n-1)/2分解为part_one和part_two。这种做法好吗
  2. 看看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,以避免溢出。

最新更新