Solução em C do Problema 8

/*
 * SOLUCAO 1: simples e direta. Note o cuidado especial com o 
 *     ultimo segmento e ultimo elemento.
 *
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;            /* no. de elementos na sequencia */
  int i;            /* contador de numeros lidos */
  int numero;       /* usado para ler a sequencia */
  int paridade;     /* indica a paridade do segmento (0 = par, 1 = impar) */
  int k;            /* candidado a grau da alternacia */
  int kaux;         /* tamanho do segmento corrente */  
  int k_alternante; /* indica se a sequencia e' ou nao k-alternate */

  printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");

  /* leia o tamanho da sequecia */
  printf("Entre com n: ");
  scanf ("%d", &n);

  /* determina candidato a k e paridade do primeiro 1o. segmento */
  printf("Entre com o 1o. numero da sequencia: ");
  scanf ("%d", &numero);
  paridade = numero % 2;
  k = 1;
  i = 1; 
  while (i < n && numero % 2 == paridade) 
    {
      printf("Entre com o %do. numero da sequencia: ", i+1);    
      scanf ("%d", &numero);
      i = i + 1; /* mais um numero foi lido */
      if (numero % 2 == paridade)
        {
          k = k + 1;
	}
    }

  /* neste ponto vale que k e' o comprimento do 1o. segmento de 
   * mesma paridade.
   */
  printf("candidato a k = %d\n", k);


  /* a sequencia e' k-alternante ate que se prove o contrario */
  k_alternante = TRUE;
  while (i < n) 
    {
      /* ajuste a alternancia da paridade */
      paridade = (paridade + 1) % 2; 

      kaux = 1;
      while (i < n && numero % 2 == paridade) 
	{
	  printf("Entre com o %do. numero da sequencia: ", i+1);    
	  scanf ("%d", &numero);
	  i = i + 1; /* mais um numero foi lido */
	  if (numero % 2 == paridade)
	    {
	      kaux = kaux + 1;
	    }
	}
      
      if (kaux != k) 
	{
	  k_alternante = FALSE;
	}
    }
  
  /* o ultimo elemento merece um cuidado especial... */
  if (numero % 2 != paridade && k != 1) 
    {
      k_alternante = FALSE;
    }
  
  if (k_alternante == TRUE) 
    printf("A sequencia e %d-alternante\n", k);
  else
    printf("A sequencia nao e' k-alternante\n");
    
  return 0;
} 

/*
 * SOLUCAO 2: similar a solucao 1, mas sem laco encaixado.
 *
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;            /* no. de elementos na sequencia */
  int i;            /* contador de numeros lidos */
  int numero;       /* usado para ler a sequencia */
  int paridade;     /* indica a paridade do segmento (0 = par, 1 = impar) */
  int k;            /* candidado a grau da alternacia */
  int kaux;         /* tamanho do segmento corrente */  
  int k_alternante; /* indica se a sequencia e' ou nao k-alternate */

  printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");

  /* leia o tamanho da sequecia */
  printf("Entre com n: ");
  scanf ("%d", &n);

  /* leia o 1o. elemento e determine a paridade do 1o. segmento */
  printf("Entre com o 1o. numero da sequencia: ");
  scanf ("%d", &numero);
  paridade = numero % 2;

  /* determine o candidato a k */
  k = 1;
  i = 1; 
  while (i < n && numero % 2 == paridade) 
    {
      printf("Entre com o %do. numero da sequencia: ", i+1);    
      scanf ("%d", &numero);
      i = i + 1; /* mais um numero foi lido */
      if (numero % 2 == paridade)
        {
          k = k + 1;
	}
    }

  printf("candidato a k = %d\n", k);
  /* neste ponto vale que k e' o comprimento do 1o. segmento de 
   * mesma paridade.
   */


  /* a sequencia e' k-alternante ate que se prove o contrario */
  k_alternante = TRUE;
  kaux = 1; /* tamanho do segmento atual */
  paridade = (paridade + 1) % 2; /* ajusta paridade */
  while (i < n) 
    {
      /* ainda precisamos ler algum elemento */
      printf("Entre com o %do. numero da sequencia: ", i+1);    
      scanf ("%d", &numero);
      i = i + 1; /* mais um elemento foi lido */
      
      if (numero % 2 == paridade) 
	{
          /* estamos no mesmo segmento */
	  kaux = kaux + 1;
	}
      else
	{  
	  /* ocorreu uma quebra de segmento */
	  if (kaux != k) 
	    {
	      k_alternante = FALSE;
	    }
	  kaux = 1;
	  paridade = (paridade + 1) % 2;
	} 
    }



  /* o ultimo segmento merece um cuidado especial... */
  if (kaux != k) 
    {
      k_alternante = FALSE;
    }
  
  if (k_alternante == TRUE) 
    printf("A sequencia e %d-alternante\n", k);
  else
    printf("A sequencia nao e' k-alternante\n");
    
  return 0;
} 

/*
 * SOLUCAO 3: solucao sem laco encaixado e com o tratamento do 
 *       ultimo segmento dentro do laco principal.
 *
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;            /* no. de elementos na sequencia */
  int i;            /* contador de numeros lidos */
  int numero;       /* usado para ler a sequencia */
  int paridade;     /* indica a paridade do segmento (0 = par, 1 = impar) */
  int k;            /* candidado a grau da alternacia */
  int kaux;         /* tamanho do segmento corrente */  
  int k_alternante; /* indica se a sequencia e' ou nao k-alternate */

  printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");

  /* leia o tamanho da sequecia */
  printf("Entre com n: ");
  scanf ("%d", &n);

  /* leia o 1o. elemento e determine a paridade do 1o. segmento */
  printf("Entre com o 1o. numero da sequencia: ");
  scanf ("%d", &numero);
  paridade = numero % 2;

  /* determine o candidato a k */
  k = 1;
  i = 1; 
  while (i < n && numero % 2 == paridade) 
    {
      printf("Entre com o %do. numero da sequencia: ", i+1);    
      scanf ("%d", &numero);
      i = i + 1; /* mais um numero foi lido */
      if (numero % 2 == paridade)
        {
          k = k + 1;
	}
    }

  printf("candidato a k = %d\n", k);
  /* neste ponto vale que k e' o comprimento do 1o. segmento de 
   * mesma paridade.
   */


  /* a sequencia e' k-alternante ate que se prove o contrario */
  k_alternante = TRUE;
  kaux = 1; /* tamanho do segmento atual */
  paridade = (paridade + 1) % 2; /* ajusta paridade */
  while (i <= n) 
    {
      if (i == n) 
	{
          /* acabou de ler a sequencia */ 
          if (kaux != k) 
	    {
	      k_alternante = FALSE;
	    }
	}
      else 
	{
          /* ainda precisamos ler algum elemento */
	  printf("Entre com o %do. numero da sequencia: ", i+1);    
	  scanf ("%d", &numero);
	  
	  if (numero % 2 == paridade) 
	    {
	      kaux = kaux + 1;
	    }
	  else
	    {
	      if (kaux != k) 
		{
		  k_alternante = FALSE;
		}
	      kaux = 1;
	      paridade = (paridade + 1) % 2;
	    } 
	}
      i = i + 1; 
    }
  
  if (k_alternante == TRUE) 
    printf("A sequencia e %d-alternante\n", k);
  else
    printf("A sequencia nao e' k-alternante\n");
    
  return 0;
} 

/*
 * SOLUCAO 4: eta solucao bonita.
 *
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;            /* no. de elementos na sequencia */
  int i;            /* contador de numeros lidos */
  int numero;       /* usado para ler a sequencia */
  int paridade;     /* indica a paridade do segmento (0 = par, 1 = impar) */
  int k;            /* candidado a grau da alternacia */
  int kaux;         /* tamanho do segmento corrente */  
  int k_alternante; /* indica se a sequencia e' ou nao k-alternate */

  printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");

  /* leia o tamanho da sequencia */
  printf("Entre com n: ");
  scanf ("%d", &n);

  /* leia o 1o. elemento e determine a sua paridade */
  printf("Entre com o 1o. numero da sequencia: ");
  scanf ("%d", &numero);
  paridade = numero % 2; 
  kaux = 1; /* comprimento corrente do segmento */ 

  /* a sequencia e' k-alternante ate que se prove o contrario */
  k_alternante = TRUE;
  k = 0; /* o valor de k ainda precisa ser determinado */
  for (i = 1; i <= n; i++)
    {
      /* caso 1: i == n */
      if (i == n) 
	{
	  /* acabou de ler a sequencia */ 
          /* caso 1A: 1o. segmento */ 
	  if (k == 0) 
	    {
	      /* a sequencia e' composta por numeros de mesma paridade */
	      k = kaux;
	    }
          /* caso 1B: nao e' o 1o. segmento */
          else if (kaux != k) 
	    {
	      k_alternante = FALSE;
	    }
	}
      /* caso 2: i != n */
      else 
	{
	  printf("Entre com o %do. numero da sequencia: ", i+1);    
	  scanf ("%d", &numero);

          /* caso 2A: numero % 2 == paridade */	  
 	  if (numero % 2 == paridade) 
	    {
	      kaux = kaux + 1;
	    }
          /* caso 2B: numero % 2 != paridade */	  
	  else
	    {
              /* caso 2B1: 1o. segmento */
              if (k == 0)
		{
		  k = kaux;
		}
              /* caso 2B2: nao e' o 1o. segmento */
              else if (kaux != k) 
		{
		  k_alternante = FALSE;
		}
	      kaux = 1;
	      paridade = (paridade + 1) % 2;
	    } 
	}
    }
  
  if (k_alternante == TRUE) 
    printf("A sequencia e %d-alternante\n", k);
  else
    printf("A sequencia nao e' k-alternante\n");
    
  return 0;
} 

/*
 * SOLUCAO 5:  solucao 4 sem chaves superfluas  
 *
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;            /* no. de elementos na sequencia */
  int i;            /* contador de numeros lidos */
  int numero;       /* usado para ler a sequencia */
  int paridade;     /* indica a paridade do segmento (0 = par, 1 = impar) */
  int k;            /* candidado a grau da alternacia */
  int kaux;         /* tamanho do segmento corrente */  
  int k_alternante; /* indica se a sequencia e' ou nao k-alternate */

  printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");

  /* leia o tamanho da sequencia */
  printf("Entre com n: ");
  scanf ("%d", &n);

  /* leia o 1o. elemento e determine a sua paridade */
  printf("Entre com o 1o. numero da sequencia: ");
  scanf ("%d", &numero);
  paridade = numero % 2; 
  kaux = 1; /* comprimento corrente do segmento */ 

  /* a sequencia e' k-alternante ate que se prove o contrario */
  k_alternante = TRUE;
  k = 0; /* o valor de k ainda precisa ser determinado */
  for (i = 1; i <= n; i++)
    if (i == n) 
      {
	/* 1o. segmento */ 
	if (k == 0) k = kaux;
	/*  nao e' o 1o. segmento */
	else if (kaux != k)  k_alternante = FALSE;
      }
    else 
      {
	printf("Entre com o %do. numero da sequencia: ", i+1);    
	scanf ("%d", &numero);
	
	if (numero % 2 == paridade) kaux++;
	else
	  {
	    /* 1o. segmento */
	    if (k == 0) k = kaux;
	    /* nao e' o 1o. segmento */
	    else if (kaux != k) k_alternante = FALSE;
	    
	    kaux = 1;
	    paridade = (paridade + 1) % 2;
	  } 
      }
  
  if (k_alternante == TRUE) 
    printf("A sequencia e %d-alternante\n", k);
  else
    printf("A sequencia nao e' k-alternante\n");
  
  return 0;
} 



Lista de Problemas

História da Computação | Listas de Exercícios | Problemas Resolvidos | macmulti@ime.usp.br