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

Треугольное число представляет собой сумму 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? Эта картина повторяется регулярно.-- >

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Сумма чисел от 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

Это должно помочь вам начать...

Ответ 4

Я не знаю, является ли это самым быстрым, но вот какая-то математика, которая должна помочь вам в правильном направлении...

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

Теперь у вас есть квадратичное уравнение.

Решите для n.

Если n не имеет дробных битов, вам хорошо идти.

Ответ 5

Нам просто нужно проверить, является ли 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 square root is an Integer.
}

}
public Boolean isTriangular(int z)
{
    return(isSquare(8*z+1));
}

Ответ 6

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

Ответ 7

Принятые ответы отведут вас на другой этап проверки того, является ли число идеальным квадратом. Почему бы просто не следовать? Требуется то же самое, что найти идеальный квадрат.

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

Чтобы узнать, является ли число треangularьным числом, используйте следующую формулу:

const pagesInBook = (num) => Number.isInteger((Math.sqrt(8 * num+1) -1 )/2)