Programa que conte numeros triangulares

Boa Noite

Estou com um exercício da facul e não sei nem por onde comecar a fazer, será que vocês poderiam me dar uma ajuda ae?
seue abaixo:

Qual é o primeiro número triangular que possui mais de 500 divisores?
A seqüência dos números triangulares é gerada somando-se os números naturais. Assim, o sétimo
número triangular é 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. Os dez primeiros termos são:
1, 3, 6, 10, 15, 28, 36, 45, 55, …
Vamos fatorar os sete primeiros números triangulares:
1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
15: 1, 3, 5, 15
21: 1, 3, 7, 21
28: 1, 2, 4, 7, 14, 28
Podemos ver que o sétimo número triangular, 28, é o primeiro número triangular que possui 5 divisores.
Qual é o primeiro número triangular que tem mais de 500 divisores?

obrigado!

X! >= 500

Achando X, você já sabe o que fazer :slight_smile:

Até!

enquanto o número de divisores for menor que 500 faça NT = próximo número triangular; fatore NT; calcule e conte o número de divisores de NT; fim;

Já deste uma analisada no seu algoritmo?
Fatorar um número não é algo que se faça em 2 segundos. Acho melhor ele estudar um pouco de álgebra e reduzir esse problema a achar qual é o menor número com 500 divisores e apartir dele achar o número triangular com 500 ou mais divisores.

Dessa maneira ele vai rodar o programa e vai ter a resposta no outro dia.

Até!

nao fui eu que fiz este algoritimo, ele é apenas um exemplop dado pelo professor, que faz parte do problema… de qualquer maneira obrigado…

tem outro aqui que não entendi muito bem mas parece mais simples, se alguem pudesse me ajudar também:

Encontrar a soma dos digitos de 100!

vlw

Cara, esse problema dos números tringulares te exige mto mais conhecimento matemático do que de programação. Fiz um algoritmo que é semi força bruta, consegui elaborar uns meios de ignorar alguns cálculos desnecessários, mas, mesmo assim ainda demora mtoooo.

Pra ti ter uma ideia, minha máquina (rodando o algoritmo nesse momento) ta nesse número triangular aqui 7556328 e ainda tem só 148 divisores se não me engano =P. Imagina o tamanho desse número que teu professor quer achar.

Nem sei se ainda estas interessado nesse tópico…Se quizer o código me avisa.

Att.

Um número triangular é um número t = n (n + 1) / 2, sendo n >= 0. Por exemplo, se n = 7, então t = 56.

O número de divisores de um número t pode ser determinado fatorando o número. Digamos que um número t tenha os fatores primos a, b e c.

t = a^x . b^y . c^z

Então o número de divisores é dado por (x+1).(y+1).(z+1).

Por exemplo, se t = 18907875 = 3^2 . 5^3 . 7^5, então ele tem 3 . 4 . 6 = 72 divisores.

O menor número que tem mais de 500 divisores é 14414400, que é 2^6 . 3^2 . 5^2 . 7 . 11 . 13 e tem 504 divisores.
Infelizmente esse número não é triangular.
Uma forma de achar um número triangular com 504 divisores é procurar um número que tenha 6 fatores primos , elevados às potências 6, 2, 2, 1, 1, e 1 respectivamente, e que também seja triangular (ou seja, ele é da forma n(n+1)/2)
mais ou menos como se fosse o número 14414400.

rsoliveira

sim, estou interessado ainda…

pode passar o codigo… mas o professor falou…

tem q rodar em 5 segundos :smiley:

oO
mas pode mandar ai…

[quote=JaVa_MaChInE]nao fui eu que fiz este algoritimo, ele é apenas um exemplop dado pelo professor, que faz parte do problema… de qualquer maneira obrigado…

tem outro aqui que não entendi muito bem mas parece mais simples, se alguem pudesse me ajudar também:

Encontrar a soma dos digitos de 100!

vlw[/quote]

A soma dos dígitos de 100! pode ser feita por força bruta; basta usar BigDecimal e calcular o fatorial da forma convencional (ou seja, 1 . 2 . 3 . … . 100).

[quote=JaVa_MaChInE]rsoliveira

sim, estou interessado ainda…

pode passar o codigo… mas o professor falou…

tem q rodar em 5 segundos :smiley:

oO
mas pode mandar ai…[/quote]

5 segundos!? =O

Então meu código não vai servir pra nada xD

Tava dando uma olhada nas explicações que nosso amigo moderador estava dando a respeito dos números triangulares e vou tentar fazer outro algoritmo, mas, não agora pq tô no trabalho.

Assim que der eu tento fazer o/

Att.

Para rodar em menos de 5 segundos, você vai ter que achar algum truque matemático para determinar o número de divisores sem fatorá-lo.

De fato, ele diz que tem que ter 500 divisores, mas você não precisa saber quais.

rsoliveira
oo… mas pode mandae seu codigo ai… e vlw pela ajuda

esse é o problema 12 do Project Euler.

http://projecteuler.net/index.php?section=problems&id=12

[quote=maquiavelbona]Já deste uma analisada no seu algoritmo?
Fatorar um número não é algo que se faça em 2 segundos. Acho melhor ele estudar um pouco de álgebra e reduzir esse problema a achar qual é o menor número com 500 divisores e apartir dele achar o número triangular com 500 ou mais divisores.

Dessa maneira ele vai rodar o programa e vai ter a resposta no outro dia.

Até![/quote]
Você tem razão, eu consegui o número 76576500 aqui em casa com quase 20 minutos. Por outro lado, não entendi como que X! >= 500 resolve o problema.

O número 76576500 tem 576 divisores, e é um número triangular (n = 12375).

[quote=JaVa_MaChInE]nao fui eu que fiz este algoritimo, ele é apenas um exemplop dado pelo professor, que faz parte do problema… de qualquer maneira obrigado…

tem outro aqui que não entendi muito bem mas parece mais simples, se alguem pudesse me ajudar também:

Encontrar a soma dos digitos de 100!

vlw[/quote]

Fiz aqui a soma dos dígitos de 100!, e deu 648.

Dica: usei BigInteger

a soma dos digitos de 100! da para fazer com um for??

Dá para fazer com 2 fors - um para calcular 100!, e outro para somar os dígitos.

10! tranqulio consegui fazer de boa… mas a soma dos digitos dele???