Java 测试输入的数字是否为三角形数字

Java 测试输入的数字是否为三角形数字,java,math,Java,Math,我需要创建一个程序来测试用户输入的给定数字是否是三角形数字 我创建了一个脚本,它只给出了所有三角形数字的列表,但在这个程序中,用户需要输入一个数字,程序必须确定该数字是否为三角形。如果您有三角形数字的列表,您可以搜索给定数字的初始序列,直到你找到一个大于给定值的数字或三角形数字 这个算法将是O(n) 但是你可以用二进制搜索做得更好。为此,选择下限0和上限k,其中Tk>n。然后检查T(k/2)。如果n是T(k/2),则n是三角形。如果n更大,则将下限设置为k/2+1,否则将上限设置为k/2。当下限

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


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

如果您有三角形数字的列表,您可以搜索给定数字的初始序列,直到你找到一个大于给定值的数字或三角形数字

这个算法将是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

因为你提到的维基百科文章中说


当且仅当8x+1为正方形时,整数x为三角形

当然,您可以加快平方检查速度,但这可以解决此问题:

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;
}

我认为这可能代表了任务的精神

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"); 


}
public void为三角体(int输入)
{
int currentTriNum=0;
int n=0;
while(currentTriNum<输入)
{
电流trinum+=n;
n++;
}
如果(currentTriNum!=输入)
System.out.println(“这不是一个三角形数字”);
其他的
System.out.println(“这是一个三角形数字”);
}

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

知道如果
8*n+1
是一个平方数,那么
n
必须是一个三角形数,相应的方法如下所示:

public static boolean isTriangular(int number) {
    double val = (Math.sqrt(8 * number + 1) - 1) / 2;
    return val % 1 == 0;
}

这是否意味着与“对于所有x,如果8x+1是正方形,那么x是三角形”相同?对于所有三角形数字,它认为8x+1是正方形。但是,难道就没有其他同样的数字吗?我认为必须计算三角根并检查它是否是整数。我不是三角数方面的专家,但我测试了1000个,并且检查正确。