4

我需要创建一个程序来测试用户输入的给定数字是否是三角形数字。

我创建了一个脚本,它只给出了所有三角形数字的列表,但在这个程序中,用户需要输入一个数字,程序必须确定这个数字是否是三角形的。

4

4 回答 4

11

由于您提到的维基百科文章指出

An integer x is triangular if and only if 8x + 1 is a square

您当然可以使平方检查更快一点,但这可以解决它:

public static boolean isTriangularNumber(long num) {
     long calc_num = 8*num+1;
     long t = (long) Math.sqrt(calc_num);
     if (t*t==calc_num) {
        return true;
     }
     return false;
}
于 2013-07-05T17:36:56.473 回答
3

我想这大概代表了任务的精神。

public void isTriangular(int input)
{
   int currentTriNum = 0;
   int n=0; 

   while (currentTriNum < input)
   {
     currentTriNum += n; 
     n++; 
   }

   if (currentTriNum != input) 
      System.out.println("This is NOT a triangular number");
   else 
      System.out.println("This is a triangular number"); 


}
于 2013-07-05T17:54:57.023 回答
1

三角形数是形成等边三角形的数字模式。
序列中的每个后续数字都会向三角形添加一行新的点,例如:

First_six_triangular_numbers

知道如果8 * n + 1是平方数,那么n一定是三角数,对应的方法如下:

public static boolean isTriangular(int number) {
    double val = (Math.sqrt(8 * number + 1) - 1) / 2;
    return val % 1 == 0;
}
于 2019-06-11T22:48:41.037 回答
-1

如果您有三角数列表,您可以搜索给定数的初始段,直到找到大于该数的数或三角数。

该算法将是 O(n)。

但是你可以用二分搜索做得更好。为此,选择下限 0 和上限 k,其中 Tk > n。然后检查 T(k/2)。如果 n 是 T(k/2),则 n 是三角形的。如果 n 更大,则将下限设置为 k/2 + 1,否则将上限设置为 k/2。在下限小于或等于上限时重复。

更好的是,计算三角根并检查它是否为整数:

// check to see if x is atriangular number
let a = 8*x + 1
if a is not a square number x is not triangular
let b = sqrt(a)
let n = (b-1) / 2
if n is not an integer x is not triangle
otherwise, it is the n-th triangle
于 2013-07-05T17:32:27.967 回答