Quando uso os Tipos de Dados int ou long nos cálculos,o tempo de processamento é bem mas rápido que em bigDecimal. Onde está o erro? Qual a difença?

4 respostas
programaçãojava
G

Pessoal! Bom dia! Estou criando um programinha pra calcular os divisores de um número… O problema é que, usando long, int… ele faz em um determinado tempo… e quando converto pra bigDecimal ele não atende da mesma forma… Vou mostrar onde ele diferencia nos dos exemplos. Alguém pode me dar uma dica onde está o erro. Ou a conversão está certa? Obrigado!

Usando Long.

//Detalhe das variáveis nesse caso   b é o valor de entrada usando Scanner Nesse caso   long b = scanner.nextLong();

y é um forma de reduzir o numero até um ponto que possa agilizar em questão do tempo

n é um outro redutor de tempo

long n =y;

for (long q=n; q>0; q){
if (q == y) {
                
              n =y;
              }
         
              else     if (q % 2 == 0) {
            n -= 2;
                }  else 
            n -= 4;
         
           while (b%n==0){
              
            
            q=(b/n);
          
             System.out.println("Numero encontrado:-->" + "-->B" + (b/n) + "-->N" + n + "-->q " + q   ); 
               break;

Convert bigDecimal.

BigDecimal l2 = new BigDecimal(1);

n=y;

for(BigDecimal qq = y; qq.compareTo(BigDecimal.ZERO)>0; qq = qq.subtract(l2)  ){
if (qq == y) {
        n= y;
      
            
        } else if (qq.remainder(n1).compareTo(BigDecimal.ZERO)==0) { //n1 ==2;
           
            n = n.subtract(n2); /// n2 == 2;
        } else {
           n = n.subtract(n4); // n4 == 4;
        }

           while ( b.remainder(n).compareTo(BigDecimal.ZERO)==0){
         
                qq=(b.divideToIntegralValue(n));
              
               
               
               System.out.println("Numero encontrado:-->qq" + (b.divideToIntegralValue(n)) + "-->QQQ" + qq + "-->N#" +n);  
                  
               break;
               }
          }

No primeiro Exemplo ele calcula esses dados em :
113715607991 * 43 = 4889771143613

Numero encontrado:–>-->B43–>Y113715607991–>q 43–>
CONSTRUÍDO COM SUCESSO (tempo total: 4 minutos 53 segundos)

Em bigDecimal no exemplo ele demora… Os dados antes de entrar no while são os mesmos… já verifiquei… Só que não faz no mesmo tempo… na vdd em big… não deixo nem concluir… passa dos 30 min ou mas…

4 Respostas

G

Pessoal! Preciso de ajuda… já tenho uns 3 tópicos que não recebo ajuda… Sou iniciante e minhas dúvidas são simples pra vcs que são avançados… Alguém pode me dar uma dica… Obrigado!

igomes

Olha eu até ajudaria, mas fica muito complicado saber o que variáveis com nome
q
y
n
b
representam.

É iniciante ? uma boa dica, nomes que representam o que sua variável contem.

G

Obrigado! igomes… Até entendo de lógica … ou o que eu quero. só tenho dificuldade de colocar em um programa… Mas estou estudando muito… E recordando do tempo de Escola… valeu a diga… Na vdd fica difícil de analisar…Vou detalhar as variáveis… Se possível analise! Estou lendo muito sobre bigDecimal e vi em vários tutorias que o desempenho em cálculos com números grande não é tão rápido. Com bigInterger é o mesmo desempenho de bigDecimal… Confuso! Já baixei o tempo usando o primeiro exemplo até 19 caracteres… ou digi… Faz em 12 s… e com bigDecimal… em torno de 5 a 7 min… Valeu!

G

//Detalhe das variáveis… nesse caso 1… “b” é o valor de entrada usando Scanner… Nesse caso long b = scanner.nextLong();
“y” é um forma de reduzir o numero “b” até um certo ponto que possa agilizar em questão do tempo… Encontrei um jeito de fazer isso, só que ainda não tenho certeza.
“n” é um outro redutor de tempo…

//Detalhe das variáveis… nesse caso 2. “b” é o valor de entrada usando Scanner… Nesse caso BigDecimal b = scanner.nextBigDecimal();
“y” é um forma de reduzir o numero “b” até um ponto que possa agilizar em questão do tempo…
“n” é um outro redutor de tempo…
“n2 e n4” subtrai y… e retorna n para o while…
No meu caso não preciso usar de q-=1;…

Fica assim while(b%n==0) // o " n" nos dois casos reduz e logo testa em no while…

Gostaria de saber se está equivalente ou não os dois exemplos e se tem como melhorar em Bigdecimal…?

Ok! Obrigado!
Mais um exemplo.

b == 13717426
Numero encontrado:–>-->(b/n) == 4574 -->n == 2999–>q 4574

Numero encontrado:–>-->(b/n)== 5998 -->n == 2287–>q 5998

Numero encontrado:–>-->(b/n)== 13717426–>n == 1–>q 13717426

CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)

Criado 5 de janeiro de 2017
Ultima resposta 6 de jan. de 2017
Respostas 4
Participantes 2