Comandos de Repetição & Operadores Lógicos

Problema 1:

Dizemos que um número inteiro positivo é triangular se ele é o produto de três números inteiros consecutivos. Por exemplo, 120 é triangular, pois 4*5*6 é igual a 120. Dado um número inteiro positivo n, verificar se n é triangular.

Solução 1:

#include <stdio.h>

int main(){
  int n,i,prod;

  printf("Digite o valor de n: ");
  scanf("%d",&n);
  prod = 1;
  i = 1;
  while(prod < n){
    prod = i*(i+1)*(i+2);
    i = i + 1;
  }
  i = i - 1;
  if(prod == n)
    printf("Triangular: %d = %d * %d * %d\n", n,i,i+1,i+2);
  else
    printf("Não é triangular\n");

  return 0;
}
  

Solução 2:
Solução usando o teste de parada dentro do laço com o comando break, de modo a evitar o comando i = i - 1; após o laço.

#include <stdio.h>

int main(){
  int n,i,prod;

  printf("Digite o valor de n: ");
  scanf("%d",&n);
  i = 1;
  while(1){
    prod = i*(i+1)*(i+2);
    if(prod >= n)
      break;
    i = i + 1;
  }
  if(prod == n)
    printf("Triangular: %d = %d * %d * %d\n", n,i,i+1,i+2);
  else
    printf("Não é triangular\n");

  return 0;
}
  

Solução 3:
Solução praticamente idêntica a Solução 1. Apenas foram mudadas a ordem de alguns comandos e a inicialização de i, de modo a evitar o comando i = i - 1; após o laço. Essa solução também evita o comando break usado na solução anterior.

#include <stdio.h>

int main(){
  int n,i,prod = 1;
  printf("Digite o valor de n: ");
  scanf("%d",&n);
  i = 0;
  while(prod < n){
    i = i + 1;
    prod = i*(i+1)*(i+2);
  }
  if(prod == n)
    printf("Triangular: %d = %d * %d * %d\n", n,i,i+1,i+2);
  else
    printf("Não é triangular\n");

  return 0;
}
  

Solução 4:
Solução mais compacta.

#include <stdio.h>

int main(){
  int n,i;

  printf("Digite o valor de n: ");
  scanf("%d",&n);
  i = 1;
  while(i*(i+1)*(i+2) < n){
    i = i + 1;
  }
  if( i*(i+1)*(i+2) == n)
    printf("Triangular: %d = %d * %d * %d\n", n,i,i+1,i+2);
  else
    printf("Não é triangular\n");

  return 0;
}
  

Problema 2:

Dados um número inteiro n, n>0, e uma sequência com n números inteiros, determinar o maior inteiro da sequência.

Solução:

#include <stdio.h>

int main(){
  int n,i,num,maior;

  printf("Digite o tam da seq: ");
  scanf("%d",&n);

  printf("Digite um num da seq: ");
  scanf("%d",&maior);
  i = 2;
  while(i <= n){
    printf("Digite um num da seq: ");
    scanf("%d",&num);
    if(num > maior)
      maior = num;
    i = i + 1;
  }
  printf("Maior inteiro: %d\n",maior);
  return 0;
}
  

Problema 3:

Dados um número inteiro n, n>0, e uma sequência com n números inteiros, determinar se a sequência é estritamente crescente.

Solução 1:

#include <stdio.h>

int main(){
  int n,i,num,ant,crescente = 1;

  printf("Digite o tam da seq: ");
  scanf("%d",&n);

  printf("Digite um num da seq: ");
  scanf("%d",&ant);
  i = 2;
  while(i <= n){
    printf("Digite um num da seq: ");
    scanf("%d",&num);
    if(num <= ant)
      crescente = 0;
    ant = num;
    i = i + 1;
  }
  if(crescente)
    printf("Crescente\n");
  else
    printf("Não crescente\n");

  return 0;
}
  

Solução 2:
Quando crescente recebe 0 (Falso), seu valor não é mais alterado, logo já sabemos qual será a resposta final nesse caso e, portanto, não há necessidade de continuar o laço. O laço pode ser interrompido com o comando break. Note, porém, que a sequência de números não será lida completamente. No entanto, no caso desse programa, isso não é um problema.

#include <stdio.h>

int main(){
  int n,i,num,ant,crescente = 1;

  printf("Digite o tam da seq: ");
  scanf("%d",&n);

  printf("Digite um num da seq: ");
  scanf("%d",&ant);
  i = 2;
  while(i <= n){
    printf("Digite um num da seq: ");
    scanf("%d",&num);
    if(num <= ant){
      crescente = 0;
      break;
    }
    ant = num;
    i = i + 1;
  }
  if(crescente)
    printf("Crescente\n");
  else
    printf("Não crescente\n");

  return 0;
}
  

Solução 3:
Uma terceira solução usando uma condição extra de parada do laço, ao invés de usar o comando break. Quando crescente recebe 0 (Falso), seu valor não é mais alterado, logo não há necessidade de continuar o laço nesse caso:

#include <stdio.h>

int main(){
  int n,i,num,ant,crescente = 1;
  printf("Digite o tam da seq: ");
  scanf("%d",&n);

  printf("Digite um num da seq: ");
  scanf("%d",&ant);
  i = 2;
  while(i <= n && crescente){
    printf("Digite um num da seq: ");
    scanf("%d",&num);
    if(num <= ant)
      crescente = 0;
    ant = num;
    i = i + 1;
  }
  if(crescente)
    printf("Crescente\n");
  else
    printf("Não crescente\n");

  return 0;
}