Ir ao conteúdo

Posts recomendados

Postado
#include <bits/stdc++.h>
using namespace std;

int main(){
int x, n1, n2, i, aux, aux1;
int soma, soma1;

soma = 0;
soma1 = 0;

cin >> x;

for (i=0; i<x; i++){
    cin >> n1 >> n2;
       
        if (n1 % 2 == 0){
                for (aux=n1+1; aux<n2; aux+=2)
                    soma = soma+aux;
            cout << soma << endl;}
            
        else { for (aux1=n1+2; aux1<n2; aux1+=2)
                    soma1 = soma1+aux1;
            cout << soma1 << endl;}

    }
    
}



Queria entender porque esse código não esta certo, e qualquer dica em mudanças na forma de escrever são bem vindas!! Estou aprendendo e venho tendo algumas dificuldades.
Esse código que estou fazendo é referente ao exercício 1099 do Beecrowd.

  • Amei 1
Postado

@Jaovitorlm ao que parece esse código funciona bem , porém você precisa seguir as regras do site "beecrowd" ,  por exemplo colocar uma quebra de linha no final  , e outras coisas é que se o código demorar é considerado erro também.

  • Curtir 1
Postado

@Jaovitorlm ajude os outros a ajudarem outros e a ajudarem você. Poste um link para o exercício, ou o próprio enunciado aqui

Em 16/07/2024 às 18:12, Jaovitorlm disse:

Estou aprendendo e venho tendo algumas dificuldades.

 

escreva sobre as tais dificuldades

 

Seu programa não está nada bom.

 

Mas o erro mesmo é não reiniciar a soma em zero para cada par. Não testou nada????

 

Que acha de usar o mesmo par e a soma mudar?

 

2
1 5
3
1 5
6

 

Considere algo assim

 

#include <iostream>
using namespace std;

int main(void)
{
    int x, n1, n2;
    int soma = 0;
    cin >> x;
    for (int i = 0; i < x; i++)
    {
        soma = 0;
        cin >> n1 >> n2;
        if (n1 % 2 == 0)
            for (int aux = n1 + 1; aux < n2;
                 aux += 2)
                soma += aux;
        else
            for (int aux = n1 + 2; aux < n2;
                 aux += 2)
                soma += aux;
        cout << soma << endl;
    };
    return 0;
}

 

e compare com atenção

 

Em 16/07/2024 às 18:26, devair1010 disse:

ao que parece esse código funciona bem , porém você precisa seguir as regras do site "beecrowd" ,  por exemplo colocar uma quebra de linha no final  , e outras coisas é que se o código demorar é considerado erro também.

 

Não, não funciona bem. Além do erro que expliquei, note no exemplo os resultados...

 

image.png.3530ffe153d27249d638a1e28a28b61a.png

 

Programação competitiva é uma coisa meio bobinha às vezes, ou quase sempre (minha opinião).

 

Note que o sujeito espera que 13 10 gere 11 e 6 4 gere 5. Isso quer dizer que o programa precisa prever isso e o programa proposto não faz, além de ter o outro erro que mostrei.

 

 

 

 

 

Algo assim serviria de exemplo:

 

#include <iostream>
using namespace std;

int main(void)
{
    auto N = 0;             // total
    auto primeiro = 0;  // primeiro
    auto ultimo   = 0;  // ultimo
    cin >> N;
    for (auto i = 0; i < N; i++)
    {
        auto soma = 0;
        cin >> primeiro >> ultimo;
        if (primeiro > ultimo)
        { auto aux = primeiro;
            primeiro = ultimo;
            ultimo   = aux;
        }   // inverte se fora de ordem
        if ((primeiro & 1) != 0) ++primeiro;  // impar
        for (auto num = primeiro + 1; num < ultimo;
             num += 2)
            soma += num;
        cout << soma << endl;
    };
    return 0;
}

 

Notem que há exemplos para esse exercício --- em tudo quanto é linguagem disponível --- na internet, então é perda de tempo me criticar por mostrar outro exemplo.

 

A diferença é que aqui é um forum e se o leitor não entende o exemplo ele pode perguntar...

 

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto    é que não compilei esse código de @Jaovitorlm   para ver os resultados ,  e o enunciado desse exercício está nesse link :

https://judge.beecrowd.com/pt/search?q=1099&for=problems

que já enviei um código e foi aceito :

beeCrowd1099.thumb.jpg.9f4afe0639586cd71746386ceeb926a2.jpg

e o enunciado desse exercício é este:

     beecrowd | 1099
Soma de Ímpares Consecutivos II
Adaptado por Neilor Tonin, URI  Brasil

Timelimit: 1
Leia um valor inteiro N que é a quantidade de casos de teste que vem a seguir. 
Cada caso de teste consiste de dois inteiros X e Y. Você deve apresentar a soma de todos 
os ímpares existentes entre X e Y.

Entrada
A primeira linha de entrada é um inteiro N que é a quantidade de casos de teste que vem 
a seguir. Cada caso de teste consiste em uma linha contendo dois inteiros X e Y.

Saída
Imprima a soma de todos valores ímpares entre X e Y.
___________________________________________
Exemplo de Entrada       | Exemplo de Saída|
-------------------------|-----------------|
7                        |                 |
-------------------------|-----------------|      
4 5                      | 0               |
-------------------------|-----------------|
13 10                    | 11              |
-------------------------|-----------------|
6 4                      | 5               |
-------------------------|-----------------|
3 3                      | 0               |
-------------------------|-----------------|
3 5                      | 0               |
-------------------------|-----------------|
3 4                      | 0               |
-------------------------|-----------------|
3 8                      | 12              |
-------------------------|-----------------|

 

  • Curtir 2
Postado

@devair1010 em resumo o erro maior do programa é não zerar a soma nunca. E o exercício tem essa bobagem de aceitar um par com os valores fora de ordem e não deixar isso claro no enunciado, para ver se pega o usuário que leu o enunciado e NÃO leu o exemplo. Meio besta, mas assim é.

  • Curtir 2
Postado

Obrigado pelas respostas pessoal!

@arfneto Entendi essa questão de não zerar, mas não havia percebido pois quando fiz o teste as respostas sempre foram 0, exceto a ultima que bateu com o exemplo, 12.

Eu tinha pensado nessa questão da ordem dos números, porém não havia conseguido um jeito de ordenar isso.

Se não for muito incomodo queria pedir uma explicação sobre o "int main (void)". No pequeno curso de programação que fiz, tudo que aprendi era feito com int main ( ). Outro ponto é o "auto" que foi utilizado. É um tipo de variável?

Por ultimo, aquele trecho onde faz a inversão caso os dados venham fora de ordem não fizeram muito sentido na minha cabeça. O objetivo usando aquilo eu compreendi, o que não fez muito sentido pra mim foi o código, de fato.. Se conseguir uma outra forma de explicar o procedimento feito pra eu tentar entender melhor, te agradeço muito!!

Peço desculpas pela falta de informações no post,  nunca tinha utilizado fóruns assim, estou me habituando com os recursos disponíveis.

 

 

@devair1010 Obrigado por complementar os dados necessários para a resolução de minha dúvida!

  • Obrigado 1
Postado
55 minutos atrás, Jaovitorlm disse:

Se não for muito incomodo queria pedir uma explicação sobre o "int main (void)". No pequeno curso de programação que fiz, tudo que aprendi era feito com int main ( ). Outro ponto é o "auto" que foi utilizado. É um tipo de variável?

 

É recomendado usar void na lista de parâmetros para deixar claro que não está usando parâmetros, porque usar só () pode indicar que aceita qualquer número de parâmetros. o protótipo de main nesse caso em geral é

 

	int main(int argc, char** argv)

 

58 minutos atrás, Jaovitorlm disse:

Outro ponto é o "auto" que foi utilizado. É um tipo de variável?

 

auto é isso: o compilador deduz o tipo de variável pelo contexto. auto algo = true por exemplo faz com que ele deduza que algo é boolean. Não é um tipo de variável.

 

59 minutos atrás, Jaovitorlm disse:

Por ultimo, aquele trecho onde faz a inversão caso os dados venham fora de ordem não fizeram muito sentido na minha cabeça. O objetivo usando aquilo eu compreendi, o que não fez muito sentido pra mim foi o código, de fato.. Se conseguir uma outra forma de explicar o procedimento feito pra eu tentar entender melhor, te agradeço muito!!

 

4 horas atrás, arfneto disse:
        if (primeiro > ultimo)
        { auto aux = primeiro;
            primeiro = ultimo;
            ultimo   = aux;
        }   // inverte se fora de ordem

 

Bem, até usei nomes bem explícitos para facilitar e expliquei porque... Se o primeiro for maior que o último precisa trocar os dois de lugar ou escrever dois loops separados, Veja o exemplo do site com os pares 13 e 10 e 6 e 4 e entenda que seu código não previa isso. E isso não está claro no enunciado.

Seu programa não entraria no loop se n1 fosse maior que n2.

 

Como mudar é o que está acima: salva o valor do primeiro antes de trocar pelo ultimo, e depois põe o que era o primeiro no lugar do último para poder usar um loop só.

 

1 hora atrás, Jaovitorlm disse:

Entendi essa questão de não zerar, mas não havia percebido pois quando fiz o teste as respostas sempre foram 0, exceto a ultima que bateu com o exemplo, 12.

 

Pois é: foi por isso que eu te disse sobre testar duas vezes a mesma sequência e te mostrei um exemplo com seu código....

 

5 horas atrás, arfneto disse:

Que acha de usar o mesmo par e a soma mudar?

 

2
1 5
3
1 5
6

 

Se usou o par 1 e 5 duas vezes como a soma pode dar dois valores diferentes?

 

Sobre par/ímpar: Embora comum entenda que não há muito sentido em usar módulo para testar se um número é impar. Claro que todo par tem resto zero ao dividir por dois, mas é sabido que basta olhar o último dígito para saber se um número é par. Dividir e pegar o resto é um grande exagero e demora uma eternidade se comparar com olhar o último dígito. xyzt2 é par. Porque termina em 2. Tanto faz o valor de x y z e t.

 

 

  • Obrigado 1
  • Haha 1
  • Confuso 1
Postado
18 horas atrás, Jaovitorlm disse:

dica em mudanças na forma de escrever são bem vindas!!

Suponho que não haja muitas formas de escrever, e se existem são análogas.

 

Bom Dia @Jaovitorlm

Por exemplo, pense numa progressão aritmética de razão 2... para cada par (x, y | x < y) , tem-se

 

Sn = n * (a1 + an)

 

Onde

n  ?      é metade do número de valores ímpares no intervalo x, y

a1?      é menor ímpar maior que x

an?      é maior ímpar menor que y

Sn?      é n Vezes (a1 mais an) a soma de uma P. A.

 

Neste caso que imagino para você, a programação ler x e y para determinar valores de n, a1, a2 e por fim Sn.

Suponho que assim tem uma outra forma de escrever.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!