Ir para conteúdo
Fórum Script Brasil
  • 0

Somatório de números ímpares


Biglwp

Pergunta

opa galera, começei a pouco tempo a programar e me deparei com algumas dúvidas sobre os laços for, while, do-while.

por exemplo: tenho que fazer um programa que leia do usuario um numero "n". Sabemos que n³ é a soma de numeros ímpares consecultivos. ex: 1³ = 1,

2³ = 3 + 5, 3³ = 7 + 9 + 11, ...

sempre o somatorio dos ímpares possuindo "n" termos. o programa tem que imprimir esses termos do somatorio.

cheguei a este código abaixo:

int main ()
{

int n, n3, i, s;
printf ("Digite o numero n: ");
scanf ("%d", &n);

n3 = n * n * n;
s = 0;
s = i + s;


for (i = 1; s <= n3; i = i + 2)
{
    printf ("\n%d", i);
}

return 0;
}

não está funcionando perfeitamente.

peço ajuda a vocês, não pra que mandem um código já pronto e tal, mas apenas pra tentarem identificar os erros e me ajudarem a entende-los para que posso terminar o programa.

agradeço a atenção.

Editado por Jonathan Queiroz
Modificar título para descrever melhor o tópico e adcionar tag's (Jonathan)
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

opa, pequeno erro no código lá encima.

tinha utilizado o "i" antes do for declarar um valor pra ele.

até agora tá assim.

int main ()
{

int n, n3, i, s;
printf ("Digite o numero n: ");
scanf ("%d", &n);

n3 = n * n * n;
s = 0;


for (i = 1; s <= n3; i = i + 2)
{
    s = i + s;
    printf ("\n%d", i);
}

return 0;
}

mas o prob é que ta imprimindo todos os termos, e não só os "n" ultimos (que somados dão n³)

Link para o comentário
Compartilhar em outros sites

  • 0

Ess programa parece simples, mas na verdade a lógica dele é bem complexa.

Além de pegar os N números impares consecutivos e somá-los, é preciso também pular os números que já foram somados na iteração anterior. Ou seja, quando N for 2, é preciso ignorar o [1], quando N for 3, é preciso ignorar o [1], [3] e [5].

Se a gente considerar apenas os números impares, olhando pra esses números abaixo, dá pra chegar na lógica que, o número de algaritmos pra ignorar na próxima iteração é sempre a soma de N mais os números que foram ignorados antes

0 - 1 = 1

1 - 2 = [1] + 3 + 5

3 - 3 = [1] + [3] + [5] + 7 + 9 + 11

6 - 4 = [1] + [3] + [5] + [7] + [9] + [11] + 13 + 15 + 17 + 19

Ou seja, quando N for 1, ignora zero... quando N for 2, ignora 1 + 0 (1), quando N for 3, ignora 2 + 1.

Isso eu resolvi com esse for:

for(i=0; i<n; i++)

x = x + i;

x é o número de algaritmos que você precisa ignorar.

Multiplicando x por 2 e subtraindo 1, a gente consegue o número impar equivalente aquela posição:

x = (2 * x) -1;

Mas como na verdade a gente quer apenas somar os próximos números impares depois dele, então eu somo +2 pra ir pro próximo:

x = x +2;

Daí é só criar o laço FOR, começando por esse número.

Resultado ficou assim:

#include <stdio.h>

int main () {
    int n, n3, i, s, x=0;
    printf ("Digite o numero n: ");
    scanf ("%d", &n);

    n3 = n * n * n;
    s = 0;

    for(i=0; i<n; i++)
        x = x + i;
    
    // 0 + 0 = 0 , -1
    // 0 + 1 = 1 , 1
    // 1 + 2 = 3 , 5
    // 3 + 3 = 6 , 11

    x = (2 * x) -1;
    x = x +2;

    for (i = x; s <= n3; i = i + 2) {
        s = i + s;
        printf ("%d ", i);
    }

    printf ("\n");
    return 0;
}

Editado por Mnemonic
Link para o comentário
Compartilhar em outros sites

  • 0

Eu não sou muito bom pra explicar código, vou tentar, mas desculpa se ficar mais confuso que antes :D

Pegando o exemplo de N = 3:

S = [1] + [3] + [5] + 7 + 9 + 11

Ignora os números entre chaves [] e soma os próximos N números (3)

A parte de somar os N números é fácil, pois você já tem o valor de N, e também já tem o cubo dele, então é só uma questão de chegar naquele número, como você fez no seu for:

for (i = 1; s <= n3; i = i + 2) {
    s = i + s;
    printf ("\n%d", i);
}

Nesse teu FOR as iterações ficam assim:

//i = 1

s = 1 + s;

//i = i +2; ---> i = 3

s = 3 + s;

//i = i +2; ---> i = 5

s = 5 + s;

//i = i +2; ---> i = 7

s = 7 + s;

//i = i +2; ---> i = 9

s = 9 + s;

//i = i +2; ---> i = 11

s = 11 + s;

Como pode ver, o 1, 3 e 5 estão sendo incluídos em s, mas deveria começar do 7.

Então o jeito é fazer que o valor inicial de i, em vez de 1, seja 7.

Foi daí que eu pensei na variavel x, que vai pegar o valor inicial que o laço FOR deve começar, dependendo do valor de N.

Eu vi que pra N igual a 1, o FOR começava do 1 mesmo (não precisa pular nenhum numero impar)... pra N igual a 2, o FOR começava do 3 (e pula 1 numero impar, o 1)... pra N igual a 3, o FOR começava do 7 (pula 3 numeros impares, 1, 3, 5)... então eu tentei buscar alguma relação entre eles:

N = 1 --> pula 0

N = 2 --> pula 1 [1]

N = 3 --> pula 3 [1, 3, 5]

N = 4 --> pula 6 [1, 3, 5, 7, 9, 11]

Daí eu fiquei olhando pra isso por vários dias... e a ficha caiu: N + [numero de impares que pulou] = [numero de impares a pular na proxima]

N = 1 --> 0

// 1 + 0 = 1

N = 2 --> 1

// 2 + 1 = 3

N = 3 --> 3

// 3 + 3 = 6

N = 4 --> 6

for(i=0; i<n; i++) x = x + i;

x é o número de impares pra pular, e i vale como N

Mas como o laço FOR que você criou não quer saber o número de impares pra pular e sim o número impar que ele começa a contar, eu só fiz transformar uma coisa na outra.

Exemplo: Se N = 3, o número de impares pra pular vai ser 3:

[ 1 - 3 - 5 ]- 7 - 9 - 11

A terceira (3) posição é o 5: x = (3 * 2) -1 = 6 - 1 = 5

Mas você quer começar contando a partir do 7, então: x = x + 2 = 7

O que complica é que isso acabou usando um pouco de matemática. Mas entendendo a lógica do negócio, é possível fazer um algoritmo um pouco maior, mas sem usar essas noções.

Link para o comentário
Compartilhar em outros sites

  • 0
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int n;
  printf("Digite n \n");
  scanf("%d",&n);
  printf("Cubo: %d \n",(n*n*n));
  int i;
  int j;
  int soma_impar = 2;
  if(n%2==0){
             j = 1;
             for(i=0;i<n;i++){
                         printf("Impar: %d \n",(n+j));
                          j = j + 2; 
                          }
                          }
  else{
       j = 2;
       for(i=0;i<n;i++){
                        printf("Impar: %d \n",(soma_impar+n+j));
                        j = j + 2;
                        }
                        }
  system("PAUSE");      
  return 0;
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...