我需要创建一个程序来测试用户输入的给定数字是否是三角形数字。
我创建了一个脚本,它只给出了所有三角形数字的列表,但在这个程序中,用户需要输入一个数字,程序必须确定这个数字是否是三角形的。
由于您提到的维基百科文章指出
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;
}
我想这大概代表了任务的精神。
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");
}
三角形数是形成等边三角形的数字模式。
序列中的每个后续数字都会向三角形添加一行新的点,例如:
知道如果8 * n + 1
是平方数,那么n
一定是三角数,对应的方法如下:
public static boolean isTriangular(int number) {
double val = (Math.sqrt(8 * number + 1) - 1) / 2;
return val % 1 == 0;
}
如果您有三角数列表,您可以搜索给定数的初始段,直到找到大于该数的数或三角数。
该算法将是 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