定义数字是否为三角形数字的最快方法

三角数是从1到n的n个自然数的总和。 查找给定正整数是否为三角形的最快方法是什么?

这是第1200个到第1300个三角形数字的切割,你可以在这里轻松看到一个位模式(如果没有,尝试缩小):

(720600, '10101111111011011000') (721801, '10110000001110001001') (723003, '10110000100000111011') (724206, '10110000110011101110') (725410, '10110001000110100010') (726615, '10110001011001010111') (727821, '10110001101100001101') (729028, '10110001111111000100') (730236, '10110010010001111100') (731445, '10110010100100110101') (732655, '10110010110111101111') (733866, '10110011001010101010') (735078, '10110011011101100110') (736291, '10110011110000100011') (737505, '10110100000011100001') (738720, '10110100010110100000') (739936, '10110100101001100000') (741153, '10110100111100100001') (742371, '10110101001111100011') (743590, '10110101100010100110') (744810, '10110101110101101010') (746031, '10110110001000101111') (747253, '10110110011011110101') (748476, '10110110101110111100') (749700, '10110111000010000100') (750925, '10110111010101001101') (752151, '10110111101000010111') (753378, '10110111111011100010') (754606, '10111000001110101110') (755835, '10111000100001111011') (757065, '10111000110101001001') (758296, '10111001001000011000') (759528, '10111001011011101000') (760761, '10111001101110111001') (761995, '10111010000010001011') (763230, '10111010010101011110') (764466, '10111010101000110010') (765703, '10111010111100000111') (766941, '10111011001111011101') (768180, '10111011100010110100') (769420, '10111011110110001100') (770661, '10111100001001100101') (771903, '10111100011100111111') (773146, '10111100110000011010') (774390, '10111101000011110110') (775635, '10111101010111010011') (776881, '10111101101010110001') (778128, '10111101111110010000') (779376, '10111110010001110000') (780625, '10111110100101010001') (781875, '10111110111000110011') (783126, '10111111001100010110') (784378, '10111111011111111010') (785631, '10111111110011011111') (786885, '11000000000111000101') (788140, '11000000011010101100') (789396, '11000000101110010100') (790653, '11000001000001111101') (791911, '11000001010101100111') (793170, '11000001101001010010') (794430, '11000001111100111110') (795691, '11000010010000101011') (796953, '11000010100100011001') (798216, '11000010111000001000') (799480, '11000011001011111000') (800745, '11000011011111101001') (802011, '11000011110011011011') (803278, '11000100000111001110') (804546, '11000100011011000010') (805815, '11000100101110110111') (807085, '11000101000010101101') (808356, '11000101010110100100') (809628, '11000101101010011100') (810901, '11000101111110010101') (812175, '11000110010010001111') (813450, '11000110100110001010') (814726, '11000110111010000110') (816003, '11000111001110000011') (817281, '11000111100010000001') (818560, '11000111110110000000') (819840, '11001000001010000000') (821121, '11001000011110000001') (822403, '11001000110010000011') (823686, '11001001000110000110') (824970, '11001001011010001010') (826255, '11001001101110001111') (827541, '11001010000010010101') (828828, '11001010010110011100') (830116, '11001010101010100100') (831405, '11001010111110101101') (832695, '11001011010010110111') (833986, '11001011100111000010') (835278, '11001011111011001110') (836571, '11001100001111011011') (837865, '11001100100011101001') (839160, '11001100110111111000') (840456, '11001101001100001000') (841753, '11001101100000011001') (843051, '11001101110100101011') (844350, '11001110001000111110') 

例如,您是否也可以看到旋转的正态分布曲线,由807085和831405之间的零表示? 这种模式经常重演.–>

如果n是第m个三角形数,则n = m*(m+1)/2 。 使用二次方程式求解m

 m = (sqrt(8n+1) - 1) / 2 

因此,当且仅当8n+1是完美的正方形时, n才是三角形。 要快速确定数字是否是完美的正方形,请参阅此问题: 确定整数的平方根是否为整数的最快方法 。

注意,如果8n + 1是一个完美的正方形,那么上面公式中的分子将始终是偶数,因此不需要检查它是否可被2整除。

如果8x + 1是正方形,则整数x是三角形。

家庭作业 ?

从1到N的数字之和

1 + 2 + 3 + 4 + … n-1 + n

如果你添加第一个加上最后一个,然后第二个加上第二个加上最后一个,那么……

=(1 + n)+(2 + n-1)+(3 + n-2)+(4 + n-3)+ …(n / 2 + n / 2 + 1)

=(n = 1)+(n + 1)+(n + 1)+ …(n + 1); …. n / 2次

= n(n + 1)/ 2

这应该让你开始……

我不知道这是否是最快的,但这里有一些数学可以让你朝着正确的方向……

 S = n (n + 1) / 2 2*S = n^2 + n n^2 + n - 2*S = 0 

你现在有一个二次方程。

解决n。

如果n没有小数位,那么你很高兴。

  int tri=(8*number)+1;// you can remove this for checking the perfect square and remaining all same for finding perfect square double trinum=Math.sqrt(tri); int triround=(int) Math.ceil(trinum); if((triround*triround)==tri) { System.out.println("Triangular"); } else { System.out.println("Not Triangular"); } 

在这里,ceil将始终关注下一个最高数字,这样就可以提供完美的validation机会。

接受的答案将带您到另一步检查数字是否是完美的正方形。 为什么不简单地遵循? 找到一个完美的方块需要同样的努力。

 public final static boolean isTriangularNumber(final long x) { if (x < 0) return false; final long n = (long) Math.sqrt(2 * x); return n * (n + 1) / 2 == x; } 

我们只需要检查8 *(你要检查的整数)+1是否是一个完美的正方形!

 public Boolean isSquare(int x) { return(Math.sqrt(x)==(int)Math.sqrt(x)); // x will be a perfect square if and only if it's square root is an Integer. } } public Boolean isTriangular(int z) { return(isSquare(8*z+1)); }