Qual o problema?

18 respostas
T

Galera, to no primeiro semestre de mecatronica, tenho aulas de Java e preciso entregar semanalmente trabalhos feitos nessa linguagem.
O ultimo programa q tivemos q fazer foi esse:
http://www.cic.unb.br/docentes/facp/cb/CBexer08.html
Eu fiz aqui algo q eu axo q esta certo, porem, o programa insiste em dar erro no nono par da sequencia, o decimo vem certo. Alguem poderia me apontar os eu to fazendo de errado?
Muito obrigado. Fico esperando respostas.
Abraços

PROGRAMA:

class M0479705T04{ 
public static void main(String[] arg) { 
     int b=6, d=8, r=0; 
     long s, s2; 
   do{   
     do { 
     s =((1+(b-1))*(b-1))/2; 
     s2 = ((b+1)+d)*(d-b)/2; 
     if (s==s2){ 
     System.out.println(b+" "+d); 
     r++; 
     b++; 
    } 
    b++; 
}while (b<=d); 
d++; 
b=d/2; 
}while(r<10); 
} 
    }

EDIT (Thingol) - Pus o tag [ code ] no seu post, por favor use esse tag sempre que postar código, para melhorar a probabilidade de que alguém venha a ler este post e se interessar pelo seu problema.

18 Respostas

T

E você é estudante de engenharia mesmo, tem alguma coisa com os estudantes de engenharia que não se dão bem com a indentação de código :wink: - digo isso porque também fui um.

T

Valeu. N tinha visto o botão pra colocar o codigo.
Meio chata essa minha pergunta, mas ja fiz de tudo ao meu alcance, senão n teria vindo aki.
Se alguem conseguir me ajuda vou ficar muito grato.
Abraços

S

[OFF]

Formei em Mecatrônica, mas meu código é bem identado.
Só não lembro se no inicio do curso era.

[/OFF]

ramilani12

Passa seus int para float

_fs

Bom, não sou estudante de matemática, mas seu código não possui erro. O problema reside no fato que você programou para o loop principal se repetir até a variável r ser incrementada 10 vezes, e o bloco que a incrementa (r++) só é executado 5 vezes, depois aparentemente entra em loop infinito.

T

Fala q n da pra converter float pra long.
Se eu ponho tudo como float, ele da uns numeros muito estranhos, q se vc criar outro programa pra calcular a soma das sequencias, ele n da numeros inguais…

T

Se eu declaro todas as variaveis como int, ele axa os numeros ate o 8, o 9 da pau e o 10 da certo.
N tem pq dar loop infinito, n mudei nada no programa, so o tipo de variavel.
Valeu pela dica.

fmeyer

Quem tava perguntando se java é OO puro ???

Tai um exemplo de Não JAVA não é só OO … :twisted: :twisted: :twisted:

T

Tours, só uma coisa. Peguei o seu programa e vi que tem um problema no seu algoritmo, mas de desempenho, não lógico. (O programa está logicamente correto).
Como você está fazendo por força bruta, então não é que o programa entrou em loop.
É que depois que você achou as 5 primeiras respostas, a 6a. demora um monte para ser impressa.
Peguei aquelas variáveis b, d e r e deixei como volatile static. Iniciei uma thread que fica imprimindo o valor dessas variáveis a cada segundo. Dá para ver que demora um monte para conseguir executar.
Recomendo que você repense um pouco as suas fórmulas, porque para conseguir os 10 primeiros valores você vai levar um bom tempo em um Pentium 3.7 GHz Extreme Edition.

O seu programa, modificado para eu conseguir entender o que aconteceu:

class M0479705T04{
    static volatile long b=6, d=8, r=0;
    public static void main(String[] arg) {
        new Thread() {
            public void run() {
                while (true) {
                    try {Thread.sleep (1000);} catch (InterruptedException ex) {}
                    System.out.println ("b=" + b + ", d=" + d + ", r=" + r);
                }
            }
        }.start();
        long s, s2;
        do {
            do {
                s =((1+(b-1))*(b-1))/2;
                s2 = ((b+1)+d)*(d-b)/2;
                if (s == s2) {
                    System.out.println(b + " " + d);
                    r++;
                    b++;
                }
                b++;
            } while (b <= d);
            d++;
            b = d/2;
        } while( r < 10 );
    }
}
T

Mudei seu programa para int em vez de long, e passei uma opção -server para o Java.exe (estou usando JDK 1.5.0_03) - até que executou em tempo razoável (levou quase 5 minutos em um P4 2.8GHz). (Não vou postar aqui os resultados :wink: )

Se for rodar o meu programa, como a thread fica em loop infinito, ela não vai sair também. (Mas o seu programa sai do loop.)

T

Caraca, fiquei perdido com as suas modificaçoes. Intao, teoricamente, se eu declarar todas as variaveis como long, uma hora ele vai axar os outros pares?? O algoritimo ta certo, so demora muito pra testar todos os numeros?
Alguma dica q n utilize objetos?? To começando agora a aprender metodos e objetos.
Valeus!!

T

Seu programa está bom como está, só que demora pacas pra funcionar.

Isto aqui eu só pus para monitorar as variáveis b, d e r. Pode ser tirado.

new Thread() {
             public void run() {
                 while (true) {
                     try {Thread.sleep (1000);} catch (InterruptedException ex) {}
                     System.out.println ("b=" + b + ", d=" + d + ", r=" + r);
                 }
             }
         }.start();

E o tal do static eu só pus por causa da thread que queria monitorar.

Você pode deixar o seu código como estava, é que ele demora muito mesmo.
Use java -cp . -server M0479705T04 para rodar o seu programa, e uma máquina muito boa, e veja o que acontece. Ou então mude o algoritmo.

T

Mas olha os seus ultimos pares, eles estao corretos?? Com int os pares saem relativamente rapidos msm, so q o 9º n vem certo. Se vc poe pra mostrar o resultado das contas com um System.out.println(s+ " " +s2) toda vez q ele axar um par, o 9º imprime um n negativo

T

Hum, estou refazendo as contas, não tinha reparado no que você falou (que estava fazendo as contas errado)

T

Po, valeu pelas dicas. Fico mais tranquio sabendo q o codigo ta certo.
Valeu!
Abraços

T
class M0479705T04{
    public static void main(String[] arg) {
    int b=6, d=8, r=0;
        long s, s2;
        do {
            do {
                s =((b)*(b-1L));
                s2 = ((b+1L)+d)*(d-b);
                if (s == s2) {
                    System.out.println ("s = " + (s/2) + ", s2= " + (s2/2));
                    System.out.println(b + " " + d);
                    r++;
                    b++;
                }
                b++;
            } while (b <= d);
            d++;
            b = d/2;
        } while( r < 10 );
    }
}

Fiz uma modificação cosmética no seu programa, e vi agora que está demorando mesmo, como você disse.
Talvez você tenha de descobrir um algoritmo melhor :wink:

foia

sei naum. cheguei em resultados diferentes. eita muié q gosta de passear !!

class Guj
{
  public static void main(String[] arg)
  {
    long casaTonta = 2;
    long casaTotal = 3;

    long somaEsq = 1;
    long somaDir = 3;

    int achou = 0;

    while (achou < 10)
    {
      if (somaEsq == somaDir)
      {
        System.out.println((++achou) + " " + somaEsq + " " + casaTonta + " "
            + casaTotal);
      }

      if (somaEsq < somaDir)
      {
        somaEsq += casaTonta;
        casaTonta++;

        somaDir -= casaTonta;

        casaTotal++;
        somaDir += casaTotal;
      }
      else
      {
        casaTotal++;
        somaDir += casaTotal;
      }
    }
  }
}

fôia

fmeyer

Tempo de carga da JVM
real 0m0.225s
user 0m0.040s
sys 0m0.010s

Tempo de Execução do Seu Teste
real 1m40.637s
user 1m35.870s
sys 0m0.120s

Tempo de Execução do teste do foia
real 0m1.932s
user 0m1.140s
sys 0m0.010s

Maquina GNU/Linux kernel 2.4.22 
*****************************************
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 6
model           : 8
model name      : AMD Athlon(TM) XP1700+
stepping        : 1
cpu MHz         : 1477.452
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow
bogomips        : 2949.12
*****************************************************
MemTotal:       645108 kB
Criado 11 de maio de 2005
Ultima resposta 12 de mai. de 2005
Respostas 18
Participantes 7