Самый быстрый метод определения, является ли число треугольным числом

треугольное число-это сумма n натуральных чисел от 1 до 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? Этот шаблон повторяется регулярно.-->

7 ответов


если n это m - е треугольное число, то n = m*(m+1)/2. Решение для m используя квадратичную формулу:

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

так n треугольный тогда и только тогда, когда 8n+1 является идеальным квадратом. Чтобы быстро определить, является ли число полным квадратом, см. Этот вопрос: самый быстрый способ определить, является ли квадратный корень целого числа целым.

обратите внимание, что если 8n+1-идеальный квадрат, то числитель в приведенной выше формуле всегда будет даже, поэтому нет необходимости проверять, что он делится на 2.


целое число x является треугольным точно, если 8x + 1 является квадратом.


работа на дому ?

сумма чисел от 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);.... н/в 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 всегда будет смотреть на следующий наибольшее число, так что это даст идеальный шанс для проверки.


принятые ответы перенесут вас на другой шаг проверки, является ли число идеальным квадратом. Почему бы просто не сделать следующее? Это требует таких же усилий, как и поиск идеального квадрата.

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