如果值具有小数,则改进操作顺序并进行测试

问题描述 投票:3回答:4

我正在尝试创建一个程序,打印出五边形数字,直到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{                
        } 
    }
}

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

  1. 我不知道如何正确实施运营秩序。我所做的是将操作n(3n - 1)/ 2分解为part_one和part_two。这是好习惯吗?
  2. 在while循环中查看嵌套if,我试图测试part_two是否为整数(即​​没有小数)。我尝试了很多东西,但Java并没有让我包括%运算符。
java operator-precedence
4个回答
1
投票

你错过了等式的一部分(n因子)。您可以将它们组合成一个语句,如下所示:

double num = n * (3 * n - 1) / 2

只需按照通常的方式使用括号即可。 Java了解正确的操作顺序。

请尝试以下方法检查数字是否为int:

if ((num == Math.floor(num)) && !Double.isInfinite(num)) {
  // integral type
}

这通过地板(截断十进制)数字并检查它是否与原始数字相同来工作。它还有额外的检查,以确保数量是有限的。


0
投票

我不知道如何正确实施运营秩序。我所做的是将操作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 */
    }           
} 

0
投票

正如其他人所说,你的等式的语法并不困难。 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)
     */
}

0
投票

如果你将它用于真正的大数字,大于100,我建议第一部分是n/2,第二部分是3*n - 1,以避免溢出。

© www.soinside.com 2019 - 2024. All rights reserved.